क्या मैं क्रमिक रूप से रनटाइम पर "एंड्रॉइड: लेआउट_बेलो" सेट कर सकता हूं?


203

क्या यह संभव है कि प्रोग्राम के बराबर सेट करने के लिए रनटाइम पर एक रिलेटिवलैटआउट बनाया जाएandroid:layout_below ?

जवाबों:


464

हाँ:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

सबसे पहले, कोड ऊंचाई और चौड़ाई को निर्दिष्ट करके एक नया लेआउट पैरामेट्स बनाता है। addRuleविधि ठीक से एक्सएमएल के बराबर कहते हैं android:layout_below। फिर आप बस View#setLayoutParamsउस दृश्य पर कॉल करें जिसे आप चाहते हैं कि उन पैरामेट्स हैं।


11
यह उत्तर क्यों स्वीकार नहीं किया जा सकता है? यह बहुत अच्छी व्याख्या है।
आदित्य

145

वैकल्पिक रूप से आप वर्तमान लेआउट मापदंडों का उपयोग कर सकते हैं और उन्हें संशोधित कर सकते हैं:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@EelLee यह स्पष्ट रूप से सवाल का जवाब देने का एक और तरीका है, जिसके कारण इसमें 11 अपवोट्स हैं।
एलेक्स के

8
इसके अन्य उत्तर की तुलना में अधिक अपवोट होना चाहिए: दृश्य के निरंतर व्यवहार को बनाए रखने के लिए, हमें LayoutParamsनए बनाने के बजाय मौजूदा के साथ काम करना चाहिए । वास्तव में, इसे सही उत्तर के रूप में स्वीकार किया जाना चाहिए।
एलेक्स कार्शिन

10

जबकि @jackofallcode उत्तर सही है, इसे एक पंक्ति में लिखा जा सकता है:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
यह आपको वास्तव में लेआउट बदलने की अनुमति नहीं देता है क्योंकि आपको LayoutParamsउन्हें सेट करने के लिए एक संदर्भ की आवश्यकता होती हैsetLayoutParams
स्टीफ

@ पहले, मैंने एक परियोजना में इस समाधान का उपयोग किया। जबकि जैकऑफ़लकोड समाधान केवल यहीं है, मैंने इसे सरल बनाया। लेकिन अब मुझे लगता है कि एक पंक्ति को छोटा करना अच्छा नहीं है, क्योंकि यदि कोई अपवाद होता है, तो यह समझना कठिन होगा कि ऑपरेटर ने क्या उठाया।
कूलमैन्ड

1
@CoolMind मुझे वास्तव में कोड को 1 पंक्ति में छोटा करना पसंद नहीं है, यह पढ़ने के लिए कठिन बनाता है, खासकर जब कास्टिंग शामिल होती है। इसके अलावा यह मेरा तरीका है कि आप आगे परिवर्तन करने की अनुमति देता है :)
jackofallcode

@jackofallcode, आपसे सहमत हूँ! वर्तमान में मैं कई लाइनों में भी लिखता हूं, क्योंकि जब दुर्घटना होती है, तो यह समझना आसान होता है कि किस लाइन में त्रुटि हुई।
कूलमैन्ड

1

Kotlin साथ संस्करण इन्फ़िक्स समारोह

infix fun View.below(view: View) {
      (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

तब आप लिख सकते हैं:

view1 below view2

या आप इसे सामान्य कार्य कह सकते हैं:

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