जब दृश्यता View.GONE है, तो RelativeLayout के साथ समस्या


82

मैंने RelativeLayoutइस प्रकार है:

<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>

प्रत्येक TextViewपिछले के TextViewसाथ नीचे लंगर डाला गया है android:layout_below

समस्या यह है कि TextView2 या वहाँ (या तो नहीं हो सकता है View.VISIBLEया View.GONE); अगर यह है View.VISIBLE, तो सब ठीक है, लेकिन अगर यह है View.GONE, तो TextView3 के ऊपर TextView1 के शीर्ष पर प्रदान किया जा रहा है।

मैंने इसे ठीक करने के लिए विभिन्न तरीकों की कोशिश की है, लेकिन हर बार RelativeLayout's' द्वारा पकड़ा जाता है, आप इसे परिभाषित करने से पहले एक आईडी का संदर्भ नहीं दे सकते।

मैं उम्मीद कर रहा हूँ कि मुझे यहाँ कुछ स्पष्ट याद आ रहा है।


RelativeLayoutनिकटतम गैर-गैर एंकर दृश्य खोजने के लिए एक एम्बेडेड तंत्र है। मैंने नीचे जिंजरब्रेड की जाँच की है और यह वहां भी मौजूद है: github.com/aosp-mirror/platform_frameworks_base/blob/…
Miha_x64

जवाबों:


44

आप LinearLayout में टेक्स्ट 2 और 3 को रख सकते हैं और टेक्स्टव्यू 1 के नीचे रैखिक लेआउट रख सकते हैं।


14
लेआउट फ़ाइल में पदानुक्रम जोड़ना हमेशा एक बुरा विचार होता है, खासकर यदि यह एक RelativeLayout है। जितना अधिक आप एंड्रॉइड जोड़ेंगे, आपके लेआउट का प्रतिनिधित्व करने के लिए ऑब्जेक्ट बनाएंगे। आपको एंड्रॉइड की तरह कुछ का उपयोग करना चाहिए: लेआउट_alignWithParentIfMissing = "true" के बजाय। आप उदाहरण के लिए TableLayout जैसे अन्य लेआउट का उपयोग करने पर भी विचार कर सकते हैं।
फ्रेंकोइस डर्मू

203

आप इस टैग का उपयोग कर सकते हैं:

android:layout_alignWithParentIfMissing="true"

डॉक्स से:

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


24
यह तभी काम करता है जब अभिभावक के साथ संरेखण वांछित होता है, लेकिन सवाल यह था कि पूर्व के विचार से संरेखित कैसे किया जाए, अभिभावक से नहीं।
dimsuz

@dismuz, यह गतिशील लेआउट के प्रबंधन में बहुत उपयोगी होगा और अप्रत्याशित कोने के मामलों में किसी भी आश्चर्य से बचता है।
ininprsr

11

belowजब आप TextView2 की दृश्यता को अपडेट करते हैं तो TextView3 की विशेषता को अपडेट क्यों नहीं किया जाता है ? (मुझे लगता है कि आप कोड में ऐसा करते हैं)

कुछ इस तरह

TextView tv = (TextView) findViewById(R.id.textview3);
RelativeLayout.LayoutParams lp =
    (RelativeLayout.LayoutParams) tv.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, R.id.textview1);
((TextView) view).setLayoutParams(lp);

8

यह उत्तर आपकी विशिष्ट समस्या को हल नहीं करता है, लेकिन एक समान हल करता है, इसलिए उम्मीद है कि इससे किसी को मदद मिलेगी।

मेरे पास एक ऐसी स्थिति थी जहां मेरे रिश्तेदार लेआउट में आपके TextView1 के बराबर नहीं था। इसलिए, मेरी स्थिति में, यदि TextView2 गया था, तो मैं चाहता था कि TextView3 माता-पिता के शीर्ष के साथ संरेखित हो। मैंने उस विशेषता को TextView3 में जोड़कर हल कर लिया है विशेषता Android: layout_alignWithParentIfMissing = "true"। Http://developer.android.com/resources/articles/layout-tricks-efficiency.html देखें ।

दुर्भाग्य से, मैं एक वैकल्पिक संरेखण लंगर निर्दिष्ट करने का कोई तरीका नहीं देखता जब तक कि यह माता-पिता न हो।


7

के बारे में भूल जाओ INVISIBLEया GONE, इसके बजाय का उपयोग करें:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();

params.height = 0;

params.setMargins(0,0,0,0);

view.setLayoutParams(params);

4

तुम यह केर सकते हो

<RelativeLayout>
<TextView1/>
<FrameLayout>
  <TextView2/>  // <-- View.VISIBLE OR View.GONE
</FrameLayout>
<TextView3/>
<TextView4/>
</RelativeLayout>

इस फ्रेमलेयूट के नीचे TextView3 दें जिसकी कोई पृष्ठभूमि नहीं है, इसलिए यदि TextView2 गया है, तो यह स्थान पर कब्जा नहीं करता है।


1

लंबवत अभिविन्यास के साथ सभी टेक्स्ट व्यू को रैखिकलेयूट के नीचे रखें।

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>

-3

इसके लिए एक सरल हैक अल्फा 0/1 के साथ खेलना है। और अगर कोई है तो onClickListener को भी निष्क्रिय कर दें


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