प्रोग्राम को कस्टम दृश्य का आकार कैसे बदलें?


164

मैं एक कस्टम दृश्य कोडिंग कर रहा हूं, RelativeLayout से विस्तारित किया गया है, और मैं इसे प्रोग्रामेटिक रूप से आकार बदलना चाहता हूं, मैं कैसे कर सकता हूं?

कस्टम दृश्य कक्षा कुछ इस तरह है:

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

यदि आप किसी दृश्य की ऊँचाई या चौड़ाई को पास करने में विफल होते हैं, तो Android एक अपवाद फेंकता है। एक नया लेआउटप्रैम ऑब्जेक्ट बनाने के बजाय, मूल एक का उपयोग करें, ताकि अन्य सभी सेट पैरामीटर रखे जाएं। ध्यान दें कि लेआउटपैरम्स का प्रकार getLayoutParams द्वारा लौटाया गया है , यह अभिभावक लेआउट का है, न कि आपके द्वारा देखे जा रहे आकार का।

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

2
जैसा कि @HerbertD में उल्लेख है कि मुझे भी ऐसा करने में एक त्रुटि मिलती है जब तक कि मैं LinearLayout.LayoutParams का उपयोग नहीं करता, यहां तक ​​कि इसके माध्यम से एक RelativeLayout है कि मैं आकार बदल रहा हूं।
मार्टिन बेल्चर -

6
@ ईगो एंड्रॉइड डॉक्यूमेंटेशन के अनुसार, लेआउटपार्म्स को पैरेंट व्यू में पास किया जाता है, क्योंकि यह वह व्यू है जो लेआउट के लिए जिम्मेदार है।
sstn

1
क्या मूल्य को dp मूल्य में परिवर्तित किया जाना चाहिए या यह काम करेगा।
डोरी

यह भी बेहतर है क्योंकि यह अनावश्यक रूप से एक नया लेआउटप्रेम ऑब्जेक्ट्स को तुरंत टालने से बचता है
स्टीफन किड्सन

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

समस्या सुलझ गयी!

नोट: पैरेंट लेआउट का उपयोग करना सुनिश्चित करें LayoutParams। मेरा है LinearLayout.LayoutParams!


3
Wut। आप उपयोग क्यों नहीं करेंगेRelativeLayout.LayoutParams?
एनएमआर

1
यह मेरे लिए काम नहीं किया, मुझे इसके लिए एक वर्ग कास्ट अपवाद मिला।
तपन ठाकर

4
@ टैपन थैंकर पेरेंट लेआउट के लेआउटपराम का उपयोग करें। और माय पेरेंट लेआउट LinearLayout है।
हरबर्ट

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(); } }
atroutt

2
यह डिफ़ॉल्ट मानों के लिए अन्य सभी मापदंडों को रीसेट करेगा। @smisiewicz का उत्तर बेहतर है।
मार्च को फ्रां मरोज़ा

66

यह मेरे लिए काम करता है:

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

7
यह अन्य उत्तरों की तुलना में बहुत बेहतर है क्योंकि इस कोड को सटीक प्रकार का मूल दृश्य देखने की आवश्यकता नहीं है।
बार्ट बर्ग

1
क्या आप जानते हैं कि कॉलिंग लाइकआउट () और कॉलिंग सेटलैटपराम (परमेस) में क्या अंतर है?
voghDev

2
setLayoutParams (params) requestLayout () शामिल हैं।
भ्रमजाल

44

इसके लायक क्या है, मान लें कि आप उपकरण स्वतंत्र पिक्सेल ( dp ) में दृश्य का आकार बदलना चाहते थे : -

आपको नामक एक विधि का उपयोग करने की आवश्यकता है applyDimension, जो कि TypedValueपिक्सेल से डीपीएस में बदलने के लिए कक्षा का एक सदस्य है । इसलिए यदि मैं ऊंचाई को 150dp पर सेट करना चाहता हूँ (कहूँ) - तो मैं यह कर सकता था:

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);
फ्रेंकोइस डर्मू

यह उत्तर सही उत्तर के रूप में अधिक उपयुक्त है!। धन्यवाद
यूनुस Kulyyev


6

इसे आज़माएं:

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

क्षमा करें, मैंने इसका उत्तर देने के बाद से सभी प्रश्न पोस्ट नहीं किए हैं। अब यही पूरा सवाल है। धन्यवाद!
हरबर्ट

6

यहाँ समाधान का अधिक सामान्य संस्करण @herbertD से ऊपर है:

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(); 
    }
}

@atroutt, आपने सचमुच मेरा दिन बचा लिया :)
कासिम

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
हाहा, बहुत भोला, लेकिन अच्छी तरह से काम करने का तरीका, हालांकि मैं setLayoutParams () को अंततः संभव नेस्टेड बच्चों के लिए ठीक से प्रचारित करने के लिए कॉल करने की सलाह देता हूं, इसलिए अद्यतन करने के लिए। हमेशा टाइप प्रूफ
आने वाली तारीख

@ भार्गव राव इस विषय पर मेरी मदद कर सकते हैं: https://stackoverflow.com/q/44259342/6596724
tux-world

2

आप केवल है, तो two or three condition(sizes)फिर आप उपयोग कर सकते हैं @Overide onMeasure की तरह

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

और आसानी से CustomView वर्ग में इन स्थितियों के लिए अपना आकार बदलें।


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;

यदि कोई दृश्य समूह ऐसा है जो इस दृश्य से संबंधित है, तो आपको इसे प्रभावी करने के लिए अपनाViewGroup.requestLayout () भी कॉल करना पड़ सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.