2011-12-16 10 views
11

देखें सीधे कोड पर जाएं।findViewById <include> पर शून्य लौटाता है

गतिविधि संहिता, onCreate विधि

setContentView(R.layout.main); 

View main_view = findViewById(R.id.main_view); 
View view_flipper = main_view.findViewById(R.id.vf); 
View first_tab = view_flipper.findViewById(R.id.prev_pane); 

main.xml लेआउट कोड:

<ViewFlipper android:id="@+id/vf" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <include android:id="@+id/prev_pane" layout="@layout/vf_inner" /> 
<include android:id="@+id/cur_pane" layout="@layout/vf_inner" /> 
    <include android:id="@+id/next_pane" layout="@layout/vf_inner" /> 
</ViewFlipper> 

समस्या! मुख्य दृश्य सही ढंग से मिला है, तो ViewFlipper है, फिर भी prev_pane या cur_pane या next_pane नहीं मिला है, एक शून्य सूचक वापस आ गया है। कोई विचार क्यों?

इस गतिविधि को एक इरादे का उपयोग करके एक टैब के माध्यम से बुलाया जाता है। सभी संदर्भ आईडी के सिवाय सही ढंग से हल कर रहे हैं पर

शामिल जब मैं चर का निरीक्षण किया, मैं mChildren

उत्तर

8

है ऐसा इसलिए है क्योंकि <include /> टैग अपने यूआई पदानुक्रम में एक वास्तविक दृश्य नहीं हैं में vf_inner लेआउट की सामग्री पाते हैं। वे एंड्रॉइड उपकरणों के लिए & पेस्ट निर्देश की एक प्रति अधिक हैं।

यदि आप रनटाइम पर पैन ढूंढना चाहते हैं, तो शामिल लेआउट के मूल तत्वों में आईडी जोड़ें। इस तरह वे findViewById() के माध्यम से पाए जा सकते हैं।

+0

ठीक है, सभी पैन समान हैं, फिर भी उन्हें अलग-अलग सामग्री की आवश्यकता है। इसे कैसे प्राप्त किया जा सकता है? तथ्य यह है कि सभी शामिल विचारों में एक छवि और एक आईडी के साथ एक टेक्स्टव्यू शामिल है। छवि स्थैतिक बनी हुई है, फिर भी सभी पैन के लिए टेक्स्ट अलग है। – Artis

+0

ओह, मैं देखता हूं। मेरा मानना ​​है कि एक्सएमएल उस संबंध में सीमित है * (कम से कम मुझे एटीएम नहीं है) *। हालांकि आप इसे कोड से बना सकते हैं। लेआउट inflater सेवा का उपयोग करके लेआउट के तीन उदाहरणों को फुलाएं, फुले हुए दृश्यों पर 'setId() 'का उपयोग करें। फिर 'findViewById() 'के माध्यम से ViewFlipper खोजें और' ViewFlipper.addView() 'के माध्यम से तीन लेआउट जोड़ें। –

+3

ध्यान दें कि आप व्यूफ्लिपर के बच्चों को ['ViewFlipper.getChildAt (अनुक्रमणिका)'] (http://developer.android.com/reference/android/view/ViewGroup.html#getChildAt (int) के माध्यम से संदर्भित कर सकते हैं) उनकी आईडी के बजाय। जैसे जैसे: 'first_tab = view_flipper.getChildAt (0) 'देखें। –

0

एक चीज जो आप कर सकते हैं वह है पेरेंट लेआउट के अंदर <include> कथन लपेटें (जो अभी भी आपके मुख्य पैरेंट लेआउट का बच्चा है)। उन विचारों को अलग-अलग आईडी दें ताकि आप उनमें से प्रत्येक को अलग-अलग findViewById कर सकें।

+0

उन्हें अभी भी व्यूफ्लिपर के बच्चों के रूप में माना जाएगा, इसलिए यदि आपके पास इसमें निश्चित संख्या में विचार हैं तो आपको इसके साथ कोई समस्या नहीं होनी चाहिए। – josephus

+0

+1 सही, मुझे यह संभावना याद आई। यह काम करता है यदि आपको * बच्चों को असाइन की गई * आईडी की आवश्यकता है। यदि आपको इनकी आवश्यकता नहीं है, तो इसके बजाय 'ViewFlipper.getChildAt()' का उपयोग करें, जैसा कि मेरे उत्तर की टिप्पणियों में वर्णित है। इसका कारण यह है कि आपको दृश्य पदानुक्रम जितना संभव हो उतना फ्लैट रखना चाहिए। गहरे घोंसले के दृश्य पदानुक्रमों का एक कठिन प्रदर्शन प्रभाव पड़ता है। –

संबंधित मुद्दे