Android Fragment onAttach() पदावनत




android-fragments (6)

मैंने नवीनतम समर्थन लाइब्रेरी (संस्करण 23.0.0) का उपयोग करने के लिए अपने ऐप को अपडेट किया है, मुझे पता चला है कि उन्होंने फ्रैगमेंट वर्ग के onAttach () फ़ंक्शन को हटा दिया है।

के बजाय:

onAttach (Activity activity)

यह बर्फ:

onAttach (Context context)

जैसा कि मेरा ऐप डेप्रिसिएशन से पहले पारित गतिविधि का उपयोग करता है, मुझे लगता है कि एक संभावित समाधान है:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = getActivity();
}

क्या ऐसा करने का सही तरीका होगा?

अपडेट करें:

अगर मैं 23 से कम API वाला उपकरण चलाता हूं, तो नया onAachach () भी नहीं बुलाया जा रहा है। मुझे आशा है कि ऐसा नहीं है कि वे क्या करना चाहते थे!

अद्यतन 2:

एसडीके के नवीनतम अपडेट के साथ समस्या का समाधान किया गया है।

मैंने अपने API 22 डिवाइस पर परीक्षण किया है और onAttach (संदर्भ) कहा जा रहा है।

मैंने कुछ हफ़्ते पहले खोली गई बग रिपोर्ट और Google के लोगों के उत्तरों का अनुसरण करने के लिए here क्लिक here


आप शायद android.support.v4.app.Fragment का उपयोग कर रहे हैं। इसके लिए onAttach विधि के बजाय, FragmentActivity पाने के लिए बस getActivity() का उपयोग करें, जिसके साथ टुकड़ा जुड़ा हुआ है। और आप onAttach(Context context) विधि का उपयोग कर सकते हैं।


एसडीके प्रबंधक के साथ नवीनतम सहायता पुस्तकालय डाउनलोड करें और शामिल करें

// onAttach(Activity) is necessary in some Xiaomi phones
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    _onAttach(activity);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    _onAttach(context);
}

private void _onAttach(Context context) {
    // do your real stuff here
}

23 में एपीआई के लिए gradle.app और सेट संकलन संस्करण


नीचे दिया गया उत्तर एंड्रॉइड डेवलपर वेबसाइट पर फ्रैगमेंट ट्यूटोरियल में होने वाली इस डेप्रिसिएशन चेतावनी से संबंधित है और ऊपर के पदों से संबंधित नहीं हो सकता है।

मैंने ट्यूटोरियल कोड पर इस कोड का उपयोग किया और इसने काम किया।

public void onAttach(Context context){
    super.onAttach(context);

    Activity activity = getActivity();

मैं चिंतित था कि गतिविधि शायद यह बताती है कि दस्तावेज क्या कहते हैं।

getActivity

FragmentActivity getActivity () FragmentActivity लौटें यह टुकड़ा वर्तमान में जुड़ा हुआ है। अगर खंड एक प्रसंग के साथ जुड़ा हुआ है, तो अशक्त हो सकता है।

लेकिन main_activity पर onCreate स्पष्ट रूप से दिखाता है कि टुकड़ा लोड किया गया था और इसलिए इस पद्धति के बाद, कॉल से गतिविधि को प्राप्त करने से main_activity वर्ग वापस आ जाएगा।

getSupportFragmentManager ()। प्रारंभ करना () .add (R.id.fragment_container, firstFragment) .commit ();

मुझे उम्मीद है कि मैं इसके साथ सही हूं। मैं एक पूर्ण नौसिखिया हूँ।


यदि आप फ्रेमवर्क फ्रेगमेंट का उपयोग करते हैं और डिवाइस का SDK संस्करण 23 से कम है, तो OnAttach(Context context) नहीं कहा जाएगा।

मैं इसके बजाय समर्थन अंशों का उपयोग करता हूं, इसलिए onAttach(Context context) निश्चित है और onAttach(Context context) हमेशा कहा जाता है।


वर्तमान में onAttach Fragment कोड से, यह स्पष्ट नहीं है कि क्या Context वर्तमान गतिविधि है: स्रोत कोड

public void onAttach(Context context) {
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) {
        mCalled = false;
        onAttach(hostActivity);
    }
}

यदि आप getActivity पर एक नज़र getActivity तो आपको एक ही कॉल दिखाई देगी

/**
 * Return the Activity this fragment is currently associated with.
 */
final public Activity getActivity() {
    return mHost == null ? null : mHost.getActivity();
}

इसलिए यदि आप यह सुनिश्चित करना चाहते हैं कि आपको गतिविधि मिल रही है, तो getActivity() उपयोग getActivity() (अपने onAttach में onAttach ) लेकिन null लिए जाँच करना न भूलें क्योंकि यदि mHost null आपकी गतिविधि null हो जाएगी


हालांकि ऐसा लगता है कि ज्यादातर मामलों में यह पर्याप्त है onAttach(Context) , कुछ फोन हैं (यानी: Xiaomi Redme Note 2) जहां इसे नहीं बुलाया जा रहा है, इस प्रकार यह NullPointerException का कारण बनता है। तो सुरक्षित पक्ष पर रहने के लिए मैं भी पदावनत विधि को छोड़ने का सुझाव देता हूं:

compile 'com.android.support:appcompat-v7:23.1.1'





android-fragments