कोड से डायनामिक रूप से लेआउट_वेट विशेषता कैसे सेट करें?


245

मैं layout_weightजावा कोड से गतिशील रूप से एंड्रॉइड में बटन के लिए विशेषता के लिए मूल्य कैसे निर्धारित कर सकता हूं ?


यह इस प्रश्न / उत्तर के समान होगा: stackoverflow.com/questions/4638832/… और यह एक: stackoverflow.com/questions/4637233/…
रिच शासक

यदि आप पहले से ही लेआउट (xml) फ़ाइल में दृश्य को परिभाषित कर चुके हैं, तो नए लेआउटप्रैम बनाने से xml फ़ाइल में परिभाषित अन्य पैरामेट्स ओवरराइट हो जाते हैं। तो पहले आपको "getLayoutParams" का उपयोग करना चाहिए। पूरा जवाब देखें stackoverflow.com/questions/4641072/…
शिरीष हेरवाडे

जवाबों:


463

आप इसे LinearLayout.LayoutParamsकंस्ट्रक्टर के हिस्से के रूप में पास कर सकते हैं :

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

अंतिम पैरामीटर वजन है।


2
यह होना चाहिएparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
मिथुन श्रीधरन

49
यदि आप एक डबल से एक फ्लोट के लिए कास्ट नहीं करना चाहते हैं तो सिर्फ 1.0f
Xample

8
या यहां तक ​​कि 1fअगर कोई दशमलव स्थान नहीं हैं, तो भी सरल
रखें

4
यदि माता-पिता का लेआउट है तो क्या करेंRelative
प्रतीक बुटानी

9
@pratik अगर पैरेंट लेआउट सापेक्ष है तो आप वेट का उपयोग नहीं करते
invertigo

121

उपयोग करें LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);

संपादित करें: आह, एरच का जवाब आसान है!


27
Erich का anser लिखना आसान हो सकता है, लेकिन आपका पढ़ना आसान है। चूंकि यह कहता है कि 1.0f किस विशेषता के लिए उपयोग किया जाता है।
जोहान

3
आपका स्थापित किया गया है कि आप 'view.getLayoutParams ()' कॉल करके मक्खी पर वजन को संशोधित कर सकते हैं और फिर मूल्य को संशोधित कर सकते हैं।
RobGThai

1
FILL_PARENTको हटा दिया गया है और MATCH_PARENTइसके बजाय इसका उपयोग किया जाना चाहिए।
साइमन फोर्सबर्ग

2
@LocalPCGuy सच नहीं है। जब तक आप SDK> = 8 को लक्षित कर रहे हैं (जो आपको बिल्कुल होना चाहिए), MATCH_PARENTका उपयोग FILL_PARENTपुराने उपकरणों पर भी किया जा सकता है।
केविन कोपॉक

2
@LocalPCGuy कोई भी एपीआई 7 या उससे कम का उपयोग नहीं करता है । यदि आप अपने ऐप को एपीआई 7 या उससे कम के साथ संगत बनाने की कोशिश कर रहे हैं, तो आप FILL_PARENTबनाम के बारे में चिंता करने से पहले संभवत: कई अन्य समस्याओं में भाग लेंगे MATCH_PARENT
साइमन फोर्स्बर्ग

82

यदि आप पहले से ही अपने लेआउट (xml) फ़ाइल में अपने दृष्टिकोण को परिभाषित करते हैं, तो केवल वजन को प्रोग्रामेटिक रूप से बदलना चाहते हैं, यह तरीका बेहतर है

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

नया एक लेआउटपार्म्स आपको xml फ़ाइल में हाशिये की तरह परिभाषित अन्य परामों को अधिलेखित करता है, या आपको उन सभी को लेआउटप्रेमों में निर्दिष्ट करने की आवश्यकता है।


2
"Params.weight = 1f;" के साथ आप पहले से ही लेआउटपरम्स ऑब्जेक्ट पर वजन सेट कर रहे हैं। "MButton.setLayoutParams (params);" कॉल करने की कोई आवश्यकता नहीं है।
मरमफेन

2
नहीं, आपको
setLayoutParams

1
यह वास्तव में सबसे सुंदर जवाब है और यह सीधे एक विशिष्ट यूआई ऑब्जेक्ट को बदलता है। सबसे अच्छा जवाब इस पोस्ट से भी अच्छा और पुराना है। तो यह सबसे अच्छा जवाब के रूप में हकदार है। मैंने हालांकि इस पोस्ट को अपडाउन किया।
मूल Android

बढ़िया और सरल उपाय!
जेरेमी

एक जादू की तरह काम करता है! बहुत बहुत धन्यवाद :)
विनय विस्

26

यदि चौड़ाई, ऊंचाई और वजन वाला कंस्ट्रक्टर काम नहीं कर रहा है, तो कंस्ट्रक्टर का उपयोग चौड़ाई और ऊंचाई के साथ करने का प्रयास करें। और फिर मैन्युअल रूप से वजन सेट करें।

और यदि आप चाहते हैं कि चौड़ाई वजन के अनुसार सेट की जाए, तो चौड़ाई को कंस्ट्रक्टर में 0 पर सेट करें। ऊंचाई के लिए एक ही लागू होता है। नीचे कोड मेरे लिए काम करता है।

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);

parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);

मुझे जिस चीज की जरूरत थी! हर कोई यहां वजन सेट करने के बारे में बात कर रहा है, कोई भी प्रदर्शित नहीं होता है जब उन वजन वाले बच्चों को पेरेंट व्यू में जोड़ा जाता है! मैं वास्तव में पेरेंटव्यू पर वेटसुम को कैसे जोड़ा जाए, इसकी तलाश कर रहा था! धन्यवाद!
सुद --००7

14

अगर मैं किसी को उत्तर की तलाश में हूँ, तो इसका उपयोग करें:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

यदि आप अपने लेआउट को xml फ़ाइल से आरंभ कर रहे हैं, तो यह रैखिक लेआउट के लिए नए लेआउट पैरामीटर प्रदान करने की तुलना में बहुत अधिक सुविधाजनक होगा।


यह स्वीकृत उत्तर होना चाहिए क्योंकि यह किसी भी पहले से निर्धारित चर जैसे चौड़ाई / ऊंचाई / मार्जिन / पैडिंग आदि को संशोधित नहीं करता है। सब कुछ रखा जा रहा है और वजन बदलने के दौरान फिर से उपयोग किया जा रहा है।
मरमफेन

1
यदि सेट करने का दृश्य layout_weightपहले से ही निर्धारित किया गया है, तो आपको View.requestLayout()अपडेट करने के लिए कॉल करना होगा।
आक्रमण

6

मेरे लिए कोई भी LinearLayout.LayoutParamsऔर TableLayout.LayoutParamsसही बटन के लिए काम किया है TableRow.LayoutParams। अर्थात्:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

उपयोग करने MATCH_PARENTया WRAP_CONTENTउसी के बारे में।


3
FILL_PARENTको हटा दिया गया है और MATCH_PARENTइसके बजाय इसका उपयोग किया जाना चाहिए।
साइमन फोर्सबर्ग

मुझे लगता है कि LayoutParams.MATCH_PARENT को 0.25 में बदल दिया जाना चाहिए
CoolMind

आप LayoutParamsसीधे माता-पिता को फोन करते हैं। मुझे लगता है कि आपके पास LinearLayout.LayoutParamsमाता-पिता के बिना एक दुर्घटना का उपयोग करने का प्रयास था LinearLayout
कार्ट

4

यदि आपने पहले ही लेआउट (xml) फ़ाइल में अपना दृष्टिकोण परिभाषित कर लिया है और केवल वज़न प्रो को व्याकरणिक रूप से बदलना चाहते हैं , तो फिर नए लेआउटप्रैम का निर्माण आपको xml फ़ाइल में परिभाषित अन्य पैरामेट्स को अधिलेखित कर देता है।

तो पहले आपको "getLayoutParams" और फिर setLoutoutParams का उपयोग करना चाहिए

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);


3

यदि layoutparamsपहले से ही (XML या गतिशील रूप में) परिभाषित किया गया है, तो यहां एक लाइनर है:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

अधूरा जवाब
एडम हिगिंस

0

कोटलिन का उपयोग करके आप कुछ ऐसा कर सकते हैं:

import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*

import android.widget.LinearLayout

class RespondTo : CardView {
    constructor(context: Context) : super(context) {
        init(context)
    }

    private fun init(context: Context) {


        val parent = LinearLayout(context)

        parent.apply {
            layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply {
                orientation = LinearLayout.HORIZONTAL

                addView(EditText(context).apply {
                    id = generateViewId()
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply {
                    }
                })
                addView(ImageButton(context).apply({
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
                    background = null
                    setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
                    id = generateViewId()
                    layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT).apply {
                        addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
                        // addRule(RelativeLayout.LEFT_OF, myImageButton.id)
                    }
                }))
            }
        }
        this.addView(parent)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.