मैं अभी भी इस तथ्य से हैरान हूं कि 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 हो जाता है।

1
user1785730 11 जिंदा 2019, 20:57

2 जवाब

सबसे बढ़िया उत्तर

सामान्य मामलों में, एक बार संलग्न होने के बाद, आपके पास हमेशा फ्रैगमेंट में गतिविधि होगी, क्योंकि फ्रैगमेंट नष्ट होने के बाद ही गतिविधि को अलग किया जाएगा (और कभी भी दोबारा नहीं जोड़ा जाएगा)। Android से Fragment Lifecycle ग्राफ़ https://developer.android.com/guide/components/ पर देखें। टुकड़े. एकमात्र मुद्दा, जिसके बारे में मैं सोच सकता हूं, वह यह है कि जब आप किसी अन्य थ्रेड का उपयोग कर रहे हों या रननेबल पोस्ट कर रहे हों, जिसमें कॉलबैक रेफरेंसिंग फ्रैगमेंट हो। उस स्थिति में, फ्रैगमेंट को अलग करने और नष्ट करने के बाद कॉलबैक को कॉल किया जा सकता है। अब, आमतौर पर उस स्थिति में, आप जो कर रहे हैं उसे डंप करना चाहते हैं, और बाहर निकलना चाहते हैं, तो बस जांचें कि क्या getActivity शून्य है और कुछ भी नहीं करें। यदि आपको फ्रैगमेंट नष्ट होने पर भी कुछ करना है, तो यदि आपको केवल संसाधनों या इसी तरह के संदर्भ की आवश्यकता है, तो आप सुरक्षित रूप से एप्लिकेशन कॉन्टेक्स्ट का उपयोग कर सकते हैं जिसे आप ऐप के जीवन के लिए सुरक्षित रूप से पकड़ सकते हैं। यदि आपको यूआई के लिए संदर्भ की आवश्यकता है, जैसे उपयोगकर्ता को टोस्ट दिखाना, तो एप्लिकेशन कॉन्टेक्स्ट काम नहीं करेगा। उस स्थिति में, आपको अपने कोड को फिर से डिज़ाइन करना होगा, कि गतिविधि वह है जो फ्रैगमेंट के बजाय कॉलबैक और फ़ंक्शंस से संबंधित है। यह सब माना जा रहा है कि गतिविधि अभी भी आसपास होगी।

1
lionscribe 13 जिंदा 2019, 21:08

पहले अपने टुकड़े में परिभाषित करें,

  YourActivity mContext; 

और फिर इसे अपने टुकड़े में ओवरराइड करें

@Override
public void onAttach(Context context) {
    mContext = (YourActivity) context;
    super.onAttach(context);
}

और getActivity() के स्थान पर mContext का उपयोग करें

-1
Amit 11 जिंदा 2019, 21:05