2012-08-14 7 views
42

के बीच क्या अंतर है मैं गतिशील रूप से एक रैखिक लेआउट पॉप्युलेट कर रहा हूं। प्रतिक्रिया के आधार पर, मुझे पिछले बच्चे के विचारों को साफ़ करना होगा और नए विचार बनाना होगा। मैंने दस्तावेज़ पढ़ा है, लेकिन फिर भी दो तरीकों से भ्रमित हो गया है, वे सभी एक ही कार्य को देखते हैं। मुझे किस फंक्शन का उपयोग करना चाहिए।removeAllViews() और removeAllViewsInLayout()

+0

यहां एक ही प्रश्न है। मैं एक अन्य लाइनरलेआउट के लिए एक गेटव्यू में एक लाइनरलेआउट जोड़ता हूं। RemoveAllViews() के बजाय RemoveAllViewsInLayout() का उपयोग करके मेरे साथ एक समस्या तय की गई है जहां जोड़ा गया लाइनरलेआउट अचानक गायब हो रहा था (और स्क्रॉलिंग 0_o वापस आ गया था) – Boy

उत्तर

18

removeAllViews(): - ViewGroup से सभी बच्चे के दृश्यों को हटाने के लिए इस विधि को कॉल करें। removeAllViewsInLayout(): - अपने आप से बच्चे के विचारों को हटाने के लिए एक व्यू ग्रुप सबक्लास द्वारा कॉल किया गया है, जब इसे पहले स्क्रीन पर अपने आकार को जानना चाहिए इससे पहले कि यह गणना कर सके कि यह कितने बच्चे के विचार प्रस्तुत करेगा।

चीयर्स!

public void removeAllViews() { 
    removeAllViewsInLayout(); // Details implemented here 
    requestLayout(); 
    invalidate(true); 
} 

तो जब तक आप अपने मनपसंद एक समय में invalidate() कहते हैं, आप के रूप में अच्छी removeAllViews() का उपयोग कर सकते हैं और अपने आप को थोड़ा सहेजना चाहते:

+5

यह दस्तावेज़ों के बारे में एक उत्साही संस्करण है, जो कि मिट्टी के रूप में स्पष्ट है। क्या दृश्य स्वयं (जैसे लीनारलाउट) एक व्यू ग्रुप सबक्लास नहीं है जो स्वयं से बच्चों के विचारों को हटा रहा है? और हम कैसे जानते हैं कि दृश्य को पहले स्क्रीन पर अपना आकार पता होना चाहिए इससे पहले कि यह गणना कर सके कि कितने बच्चे दृश्य प्रस्तुत करेंगे? –

8

ठीक है, स्रोत पर देख रहे हैं, वहाँ बहुत ज्यादा नहीं फर्क है टाइपिंग का

EDIT
अधिक विस्तृत स्पष्टीकरण के लिए, David Lui का उत्तर देखें। इसे समेटने के लिए, removeAllViews() का उपयोग करें जब तक कि आप एक व्यू बनाने की प्रक्रिया में न हों - इस मामले में आप removeAllViewsInLayout() पर कॉल करेंगे।

12

स्कॉट बिग्स बताते हैं कि अंतर एक बड़ा नहीं है। केवल अंतर यह है कि removeAllViews()requestLayout() और invalidate() बाद में कॉल करता है। इस अंतर का कारण यहां है कि removeAllViewInLayout() के नामकरण को समझना है। उलझन में, इसका अर्थ "इस दृश्य लेआउट के भीतर सभी विचारों को हटाएं" नहीं है।

If we look at the similar method, removeViewInLayout(), we can understand what it's supposed to mean:

लेआउट के दौरान एक दृश्य को निकालता है। यह उपयोगी है अगर आपके ऑनआउट() विधि में, आपको और विचारों को हटाने की आवश्यकता है।

तो removeAllViewsInLayout() वास्तव में अर्थ है "सभी दृश्य हटाने, और हम एक लेआउट पास दौरान इस पद्धति को कॉल कर रहे हैं (यानी onLayout())"। यही कारण है कि removeAllViewsInLayout()requestLayout() पर कॉल नहीं करता है, क्योंकि यह माना जाता है कि आप पहले से ही लेआउट पास के अंदर हैं, इसलिए किसी अन्य लेआउट पास का अनुरोध करना अनियंत्रित है।

आप removeAllViewsInLayout() का उपयोग करते हैं, तो यह आपकी जिम्मेदारी सुनिश्चित करें कि आप एक लेआउट पास के दौरान इस कॉल कर रहे हैं, या ठीक से requestLayout() और invalidate() कॉल करने के लिए आवश्यकतानुसार है।

+0

वाह, गहरी व्याख्या के लिए धन्यवाद! शायद उन्हें इसे बुलाया जाना चाहिए था, 'हटाएं सभी दृश्यों DuringLayoutConstruction() 'preposition के अस्पष्ट उपयोग से बचने के लिए, _in_। और शायद कुछ दस्तावेज मदद मिलेगी। नह, जो दस्तावेज़ पूरा करते हैं वे प्रोग्रामर को दिल का दौरा देंगे। :) –