কীভাবে প্রোগ্রাম হিসাবে কোনও কাস্টম ভিউটির আকার পরিবর্তন করতে হয়?


164

আমি একটি কাস্টম ভিউ কোডিং করছি, রিলেটিভলআউট থেকে বর্ধিত, এবং আমি এটি প্রোগ্রামিকভাবে আকার পরিবর্তন করতে চাই, আমি কীভাবে করব?

কাস্টম ভিউ ক্লাস এমন কিছু:

public ActiveSlideView(Context context, AttributeSet attr){
        super(context, attr);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(inflater != null){       
            inflater.inflate(R.layout.active_slide, this);
        }

উত্তর:


253

আপনি যদি কোনও দৃশ্যের উচ্চতা বা প্রস্থ পাস করতে ব্যর্থ হন তবে অ্যান্ড্রয়েড একটি ব্যতিক্রম ছুঁড়ে। নতুন লেআউটপ্যারাম অবজেক্ট তৈরি করার পরিবর্তে আসলটি ব্যবহার করুন, যাতে অন্য সমস্ত সেট পরামিতি রাখা হয়। নোট করুন যে getoutLayoutParams দ্বারা ফিরিয়ে আনা লেআউটপ্যারামগুলি হ'ল প্যারেন্ট লেআউটের মতো, আপনি যে আকারটি পুনরায় আকার দিচ্ছেন তা নয়।

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);

2
@ হার্বার্টডি যেমন উল্লেখ করেছে যে আমি লিনিয়ারলআউট.লায়আউটপ্যারাম ব্যবহার না করেই আমি এটি করতে একটি ত্রুটি পেয়েছি, এমনকি এটির মাধ্যমেই আমি পুনরায় আকার দিচ্ছি এমন একটি আপেক্ষিক লেআউট।
মার্টিন বেলচার - এট ওয়ার্ক

6
@ আইগো অ্যান্ড্রয়েড ডকুমেন্টেশন অনুসারে, লেআউটপ্যারামগুলি প্যারেন্ট ভিউতে স্থানান্তরিত হয়েছে, কারণ এই মতামত যা লেআউটটির জন্য দায়ী।
sstn

1
মানটি ডিপি মান রূপান্তর করা উচিত বা এটি কাজ করবে।
ডোরি

এটি আরও পছন্দনীয় কারণ এটি অযথা নতুন লেআউটপ্যারাম অবজেক্ট ইনস্ট্যান্ট করা এড়ানো হয়
স্টিফেন কিডনস

129
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

সমস্যা সমাধান!

দ্রষ্টব্য: প্যারেন্ট লেআউটটি অবশ্যই ব্যবহার করবেন না LayoutParams। আমার LinearLayout.LayoutParams!


3
Wut। আপনি কেন ব্যবহার করবেন নাRelativeLayout.LayoutParams?
এনএমআর

1
এটি আমার পক্ষে কার্যকর হয়নি, আমি এর জন্য একটি ক্লাস কাস্ট ব্যতিক্রম পেয়েছি।
তপন ঠাকর

4
@ তপন থানক প্যারেন্ট লেআউটের লেআউটপ্যারাম ব্যবহার করুন। এবং আমার প্যারেন্ট লেআউটটি লিনিয়ারলআউট।
HerbertD

10
আমি এর আরও জেনেরিক সংস্করণ লিখেছিলাম: private void resizeView(View view, int newWidth, int newHeight) { try { Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); view.setLayoutParams(ctor.newInstance(newWidth, newHeight)); } catch (Exception e) { e.printStackTrace(); } }
শে

2
এটি অন্যান্য সমস্ত পরামিতিগুলি ডিফল্ট মানগুলিতে পুনরায় সেট করবে। পছন্দ করুন
ফ্রান মারজোয়া

66

এটি আমার পক্ষে কাজ করে:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

7
এটি অন্যান্য উত্তরের চেয়ে অনেক ভাল কারণ এই কোডটির জন্য পিতামাতার ভিউগ্রুপের সঠিক ধরণের জানতে হবে না।
বার্ট বার্গ 9

1
আপনি কী জানেন কী কলিং রিকোয়েস্টলআউট () এবং সেটলয়আউটপ্যারামস (প্যারাম) কল করার মধ্যে পার্থক্য রয়েছে?
ভোগদেভ

2
সেটলআউটপ্যারামস (প্যারামস) এর মধ্যে অনুরোধ লেআউট () অন্তর্ভুক্ত রয়েছে।
মায়া

44

এটির মূল্যের জন্য, আসুন আমরা যাক আপনি ডিভাইস স্বাধীন পিক্সেল ( ডিপি ) এ দর্শনটি পুনরায় আকার দিতে চেয়েছিলেন : -

পিক্সেল থেকে ডিপিএসে রূপান্তর করতে আপনাকে applyDimensionক্লাসের একজন সদস্য নামক পদ্ধতি ব্যবহার করতে হবে TypedValue। সুতরাং যদি আমি উচ্চতাটি 150 ডিপি (বলতে) সেট করতে চাই - তবে আমি এটি করতে পারতাম:

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMetrics());
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) someLayout.getLayoutParams();
params.height = (int) pixels;
someLayout.setLayoutParams(params);

যেখানে অভিব্যক্তি: getResources().getDisplayMetrics()পর্দার ঘনত্ব / রেজোলিউশন পায়


6
হার্ড আপনার মাত্রা কোডিংয়ের পরিবর্তে আপনি এটি পিক্সেলের উচ্চতার জন্যও ব্যবহার করতে পারেন:float pixels = context.getResources().getDimensionPixelSize(R.dimen.card_height);
ফ্রাঙ্কোইস ডের্মু

এই উত্তরটি সঠিক উত্তর হিসাবে আরও উপযুক্ত! ধন্যবাদ
ইউনুস কুলিয়েভ


6

এটি চেষ্টা করে দেখুন:

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);

দুঃখিত, আপনি যেহেতু এর উত্তর দিয়েছি আমি সমস্ত প্রশ্ন পোস্ট করি নি posted এখন এটাই পুরো প্রশ্ন। ধন্যবাদ!
herbertD

6

উপরের সমাধানটির আরও জেনেরিক সংস্করণ এখানে @ হারবার্টডি থেকে দেওয়া হয়েছে:

private void resizeView(View view, int newWidth, int newHeight) { 
    try { 
        Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); 
        view.setLayoutParams(ctor.newInstance(newWidth, newHeight));   
    } catch (Exception e) { 
        e.printStackTrace(); 
    }
}

@ অ্যাটআউট, আপনি আক্ষরিকভাবে আমার দিনটি সংরক্ষণ করেছেন :)
কাসিম

5

আমি কাস্টম ভিউয়ের প্রস্থ বাড়ানোর জন্য এইভাবে ব্যবহার করেছি

customDrawingView.post(new Runnable() {
                            @Override
                            public void run() {
                                View view_instance = customDrawingView;
                                android.view.ViewGroup.LayoutParams params = view_instance
                                        .getLayoutParams();
                                int newLayoutWidth = customDrawingView
                                        .getWidth()
                                        + customDrawingView.getWidth();
                                params.width = newLayoutWidth;
                                view_instance.setLayoutParams(params);
                                screenWidthBackup = params.width;
                            }
                        });

4

আমি এটি এইভাবে সমাধান করেছি .. আমার কাছে xML ফাইলের ভিতরে মূলত একটি সহজ ভিউ রয়েছে।

 View viewname = findViewById(R.id.prod_extra);
             prodExtra.getLayoutParams().height=64;

2
হাহা, খুব নিখুঁত তবে ভাল কাজের উপায়, তবে আমি সম্ভবত নিয়মিত বাচ্চাদের পরিবর্তনের সঠিকভাবে প্রচার করার জন্য সেটলয়আউটপ্যারামস () কে কল করার পরামর্শ দিই, তাই .উইথ এবং হাইটের পরে, ভিউ সেট করুন। সর্বদা প্রমাণ টাইপ করুন
comeGetSome

@ ভরগাভ রাও আপনি এই বিষয়টিতে আমাকে সহায়তা করতে পারেন: https://stackoverflow.com/q/44259342/6596724
tux-world

2

আপনার যদি কেবলমাত্র থাকে two or three condition(sizes)তবে আপনি @ ওভারাইডের onMeasure মতো ব্যবহার করতে পারেন

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

এবং কাস্টমভিউ ক্লাসে এই শর্তগুলির জন্য আপনার আকারটি সহজেই পরিবর্তন করুন।


1

আপনি যদি ওভাররাইড onMeasureকরছেন তবে নতুন আকারগুলি আপডেট করতে ভুলবেন না

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(newWidth, newHeight);
}

1

এভাবেই আমি এটি অর্জন করেছি। ইন Sileria উত্তর তিনি / সে নিম্নলিখিত যা করেছে:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

এটি সঠিক, তবে এটি আমাদের উচ্চতা দেওয়ার প্রত্যাশা করে pixelsতবে আমি উচ্চতাটি দিতে dpচাই তাই আমি যুক্ত করেছিলাম:

public int convertDpToPixelInt(float dp, Context context) {
    return (int) (dp * (((float) context.getResources().getDisplayMetrics().densityDpi) / 160.0f));
}

সুতরাং এটি এর মতো দেখাবে:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = convertDpToPixelInt(50, getContext());
layout.requestLayout();

0

এটি আমিই করেছি:

View myView;  
myView.getLayoutParams().height = 32;  
myView.getLayoutParams().width = 32;

যদি এই দৃশ্যের সাথে সম্পর্কিত কোনও ভিউ গ্রুপ থাকে তবে এটি কার্যকর হওয়ার জন্য আপনাকে নিজের ভিউগ্রুপ.রেকুয়েস্টলয়আউট () কল করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.