प्रोग्रामेटिक रूप से रिलेटिव लेआउट में एक बटन के Layout_align_parent_right विशेषता को कैसे सेट करें?


285

मेरे पास एक रिश्तेदार लेआउट है जिसे मैं प्रोग्रामेटिक रूप से बना रहा हूं:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

अब मेरे पास दो बटन हैं जिन्हें मैं इस संबंधित लेआउट में जोड़ना चाहता हूं। लेकिन समस्या यह है कि दोनों बटन को एक दूसरे पर RelatiiveLayout के ओवरलैपिंग के बाईं ओर दिखाया जा रहा है।

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

अब मैं यह जानना चाहता हूं कि मैं प्रोग्राम को android:layout_alignParentRight="true"या android:layout_toLeftOf="@id/btn"बटन की विशेषता को कैसे सेट कर सकता हूं जैसा कि हम xml में करते हैं?"

जवाबों:


638

आप किसी भी LayoutParamsकोड का उपयोग करके एक्सेस कर सकते हैं View.getLayoutParams। आपको बस इतना पता होना चाहिए कि LayoutParamsआपकी पहुँच क्या है । यह आम तौर पर युक्त की जाँच करके प्राप्त किया जाता है ViewGroupयदि इसमें एक LayoutParamsआंतरिक बच्चा है तो वह है जिसे आपको उपयोग करना चाहिए। आपके मामले में RelativeLayout.LayoutParams। आप उपयोग कर रहे होंगे RelativeLayout.LayoutParams#addRule(int verb)औरRelativeLayout.LayoutParams#addRule(int verb, int anchor)

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

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);

button.setLayoutParams(params); //causes layout update

1
क्या होगा अगर एंकर के पास कोई आईडी नहीं है? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = नया TextView (अधिनियम);
सेंट रॉबसन

18
आईडी जोड़ने के बारे में कैसे?
user2161301

1
क्या होगा यदि buttonएक पर है RecycleView? क्या यह समान या विपरीत नियमों को एक ही विजेट में जोड़ने में समस्या नहीं है?
जानोस

इसका काम केवल एक बार के लिए है, अगर मैं संरेखण को अपडेट नहीं कर रहा हूं। क्या मुझे पता है कि क्या मुद्दा हो सकता है ??
शशांक भोंग

मैंने उसका उपयोग करने की कोशिश की, लेकिन यह मेरे कोड में लाल हो गया addRule?

12
  1. आपको उन बटनों के लिए बनाना और आईडी बनाना होगा जिनकी आपको आवश्यकता है: btn1.setId(1);
  2. आप अपने लेआउट में पैरामीटर जोड़ने के लिए पैरामस चर का उपयोग कर सकते हैं, मुझे लगता है कि विधि है addRule(), इस LayoutParamsऑब्जेक्ट के लिए एंड्रॉइड जावा डॉक्स देखें ।

मैं कोड के किसी भी टुकड़े की बहुत सराहना करूंगा। मुझे बटन में कोई विधि नहीं मिली।
फहद अली

जब से setId @IdRes के साथ एनोटेट किया जा रहा है तब से एक नंबर के बजाय एक वास्तविक संसाधन आईडी की उम्मीद करने के बाद से id सेट करना मदद नहीं करता है।
केविन टैन

तब यह नया है, अतीत में आप उदाहरण के लिए लेआउट से एक संसाधन संख्या ले सकते थे और इसे संसाधन आईडी के लिए एक आधार के रूप में उपयोग करेंगे जो टकराएगा नहीं। मुझे लगता है कि Google ने अवरुद्ध किया होगा /
कोडस्क्रबर

6

एक ऐसा RelativeLayoutगुण जोड़ने के लिए जिसका मूल्य सही है या 0गलत और गलत के लिए गलत उपयोग RelativeLayout.TRUEहै:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)

इससे कोई फर्क नहीं पड़ता कि विशेषता पहले से ही थी या नहीं, आप अभी भी addRule(verb, subject)इसे सक्षम / अक्षम करने के लिए उपयोग करते हैं। हालाँकि, पोस्ट-एपीआई 17 आप उपयोग कर सकते हैं removeRule(verb)जो कि केवल एक शॉर्टकट है addRule(verb, 0)


0

कोटलिन संस्करण:

बाद में कॉल को सरल बनाने वाले इनफ़िक्स फ़ंक्शन के साथ इन एक्सटेंशन का उपयोग करें

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

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

infix fun View.alightParentRightIs(aligned: Boolean) {
    val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
    if (aligned) {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
    } else {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
    }
    this.layoutParams = layoutParams
}

फिर उन्हें इनफ़िक्स फ़ंक्शन कॉल के रूप में उपयोग करें:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

या आप उन्हें सामान्य कार्यों के रूप में उपयोग कर सकते हैं:

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