2012-07-18 12 views
12

मैं गतिविधि पर एक्शन बार का उपयोग कर रहा हूं। प्रत्येक टैब के लिए मैं अलग-अलग लेआउट दिखा रहा हूं। चूंकि लेआउट बहुत भारी है। इसलिए मैं प्रत्येक लेआउट को एक दृश्य में फुला रहा हूं। इसलिए प्रत्येक टैब पर तो अब अगर मैं टैब दूसरी बार चयन चयनएंड्रॉइड गतिविधि रिटर्न शून्य

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (mView == null) { 
     mView = LayoutInflater.from(mAct).inflate(mLayout, null); // mAct is Activity reference 
    } 
    mAct.setContentView(mView); 
    for (int i = 0; i < mFrags.length; i++) { 
    mFrags[i] = (LutronFragment) mAct.getFragmentManager() 
     .findFragmentById(mIds[i]); 

    if (mFrags[i] != null) { 
     mFrags[i].setupHeader(); 
     } 
    } 
} 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    for (Fragment f : mFrags) { 
    try { 
     if (f != null) { 
     ft.remove(f); 
     } 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

और उस टैब पर कुछ आपरेशन करते हैं, अनुप्रयोग getActivity पर दुर्घटनाग्रस्त हो गया मिलता है। (NullPointerException)

कृपया सुझाव है कि अगर वहाँ के लिए कुछ अन्य दृष्टिकोण है भारी लेआउट कैश।

+0

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

उत्तर

36

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

तो, पहली बार जब आप अपना टुकड़ा बनाते हैं, तो यह आपकी गतिविधि से जुड़ा हुआ है। सब अच्छा है। फिर जब आप टैब बदलते हैं, तो आपका टुकड़ा गतिविधि से अलग हो सकता है या नहीं। जब आप इसे वापस टैब करते हैं, तो पुराना टुकड़ा गतिविधि से अलग किया जा सकता है और इसलिए getActivity() शून्य लौटाता है।

यह हो सकता है यदि आप FragmentManager के माध्यम से उन्हें एक्सेस करने के बजाय अपने टुकड़ों के संदर्भ रखने की कोशिश कर रहे हैं।

यह भी हो सकता है यदि आपका एडाप्टर एक नए टुकड़े के बजाय एक टुकड़े के संदर्भ को वापस कर रहा है। मैं इस जाल में गिर गया हूँ।

संपादित

शायद this पर एक नज़र और कैसे वे अपने ActionBar श्रोताओं को जोड़ने बनाने (कोड जहां आप अपने टुकड़े मदद कर सकता है बनाने के पोस्ट करना)। आपको अपनी गतिविधि के दायरे की आवश्यकता है। वे जिस तरह से करते हैं वह गतिविधि/टुकड़ा (एक इंटरफ़ेस को लागू करने के माध्यम से) में श्रोता को परिभाषित करना है और फिर इसे टैब से संलग्न करना है। यह आपको गुंजाइश देगा और शायद चीजों को करने का एक और अधिक स्थिर तरीका है।

+0

कृपया अपना प्रश्न संपादित करें और इसे नीचे के रूप में जोड़ें। इसे पढ़ने की कोशिश करना वाकई मुश्किल है। –

+0

आप इस कोड को कहां से बुला रहे हैं? ऐसा लगता है कि इसे आपकी गतिविधि से बुलाया जाएगा। यदि हां, तो अपनी गतिविधि में अपनी गतिविधि का संदर्भ क्यों रखें? क्यों नहीं 'mAct.setContentView (mView) 'के बजाय' setContentView (mView) 'को कॉल करें? –

+0

Plz संपादित प्रश्न –

5

यह तब हो सकता है जब आप getActiviy() पर कॉल करने वाले किसी टुकड़े के अंदर एक अज्ञात ऑब्जेक्ट बनाते हैं। अगर getActivity() को अज्ञात ऑब्जेक्ट में खंडित किया जाता है तो टुकड़े टुकड़े के ढेर से निकलते हैं, getActivity() शून्य वापस आ जाएगा। उस समय, टुकड़ा अब एक गतिविधि से जुड़ा हुआ नहीं है।

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