मैं अभी भी इस तथ्य से हैरान हूं कि Google एंड्रॉइड एपीआई में एक विधि डालता है जो कभी-कभी काम करता है और कभी-कभी नहीं; अर्थात् Fragment.getActivity()
। मुझे पता है, मैं जांच सकता हूं कि क्या परिणाम null
है और isAdded()
विधि भी है। हालांकि, जब इन जांचों का परिणाम नकारात्मक हो तो मुझे कैसे आगे बढ़ना चाहिए? जब मैं इतनी दूर आ गया हूं, तो एक कारण है कि मैं Activity
तक पहुंचना चाहता हूं, जैसे Resources
या Preferences
तक पहुंचना या कोई एक ऐसा कार्य करना जिसके लिए Context
एंड्रॉइड में।
मैं जो कुछ भी करने वाला था वह मैं बस नहीं कर सकता था। हालांकि, मुझे लगता है कि यह एक खराब उपयोगकर्ता अनुभव होगा, अगर मेरा ऐप कभी-कभी उपयोगकर्ता द्वारा चयनित कार्रवाई को निष्पादित करता है और कभी-कभी नहीं। वास्तव में, मुझे लगता है कि मेरे ऐप को क्रैश होने देना ज्यादा बुरा नहीं होगा।
या मैं उपयोगकर्ता को अलग गतिविधि के बारे में बता सकता हूं और उसे बाद में फिर से प्रयास करना चाहिए। लेकिन रुकिए, Toast
को Context
की आवश्यकता है, इसलिए मैं ऐसा भी नहीं कर सकता।
या क्या मुझे इस तरह गतिविधि को फिर से जोड़ने की प्रतीक्षा करनी चाहिए?
Activity activity = getActivity();
while (activity == null) {
Thread.sleep(10);
activity = getActivity();
}
(मैं गंभीरता से यह सुझाव नहीं दे रहा हूं, मैं केवल यह बताना चाहता हूं कि मैं कितना हताश हूं)
शायद मैं यह सब गलत सोच रहा हूँ। शायद मैं चीजों को गलत तरीके से करने की कोशिश कर रहा हूं। हो सकता है कि फ्रैगमेंट का उपयोग करने के बारे में विचार का एक स्कूल हो, जिसके बारे में मैंने नहीं सुना हो। हालांकि, अगर मुझे Activity
को Fragment
में एक्सेस करने से बचना चाहिए, तो getActivity()
विधि पहले स्थान पर क्यों है?
मैं अभी जिस विशेष समस्या से जूझ रहा हूं, वह यह है कि एक PreferenceFragment
में एक OnSharedPreferenceChangeListener
में मैं उपयोगकर्ता को एक Toast
संदेश देना चाहता हूं:
Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
यह ज्यादातर समय काम करता है, लेकिन कभी-कभी यह क्रैश हो जाता है क्योंकि getActivity()
वापस null
हो जाता है।
2 जवाब
सामान्य मामलों में, एक बार संलग्न होने के बाद, आपके पास हमेशा फ्रैगमेंट में गतिविधि होगी, क्योंकि फ्रैगमेंट नष्ट होने के बाद ही गतिविधि को अलग किया जाएगा (और कभी भी दोबारा नहीं जोड़ा जाएगा)। Android से Fragment Lifecycle ग्राफ़ https://developer.android.com/guide/components/ पर देखें। टुकड़े. एकमात्र मुद्दा, जिसके बारे में मैं सोच सकता हूं, वह यह है कि जब आप किसी अन्य थ्रेड का उपयोग कर रहे हों या रननेबल पोस्ट कर रहे हों, जिसमें कॉलबैक रेफरेंसिंग फ्रैगमेंट हो। उस स्थिति में, फ्रैगमेंट को अलग करने और नष्ट करने के बाद कॉलबैक को कॉल किया जा सकता है। अब, आमतौर पर उस स्थिति में, आप जो कर रहे हैं उसे डंप करना चाहते हैं, और बाहर निकलना चाहते हैं, तो बस जांचें कि क्या getActivity शून्य है और कुछ भी नहीं करें। यदि आपको फ्रैगमेंट नष्ट होने पर भी कुछ करना है, तो यदि आपको केवल संसाधनों या इसी तरह के संदर्भ की आवश्यकता है, तो आप सुरक्षित रूप से एप्लिकेशन कॉन्टेक्स्ट का उपयोग कर सकते हैं जिसे आप ऐप के जीवन के लिए सुरक्षित रूप से पकड़ सकते हैं। यदि आपको यूआई के लिए संदर्भ की आवश्यकता है, जैसे उपयोगकर्ता को टोस्ट दिखाना, तो एप्लिकेशन कॉन्टेक्स्ट काम नहीं करेगा। उस स्थिति में, आपको अपने कोड को फिर से डिज़ाइन करना होगा, कि गतिविधि वह है जो फ्रैगमेंट के बजाय कॉलबैक और फ़ंक्शंस से संबंधित है। यह सब माना जा रहा है कि गतिविधि अभी भी आसपास होगी।
पहले अपने टुकड़े में परिभाषित करें,
YourActivity mContext;
और फिर इसे अपने टुकड़े में ओवरराइड करें
@Override
public void onAttach(Context context) {
mContext = (YourActivity) context;
super.onAttach(context);
}
और getActivity() के स्थान पर mContext का उपयोग करें
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।