6

समस्या पर ध्यान केंद्रित करने के लिए मैं निम्नलिखित करने के लिए मामले को सरल बनाएगा - मैं एक गतिविधि है एक और एक टुकड़ा एफ जो एक और टुकड़ा चाइल्ड जोड़ रहा है। प्रत्येक के सरलीकृत कोडअपवाद जब नेस्टेड टुकड़ा की स्थिति को बचाने की कोशिश [टुकड़ा नहीं रह गया है कुंजी एंड्रॉयड के लिए मौजूद है: target_state]

गतिविधि एक

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // do some stuff 
    FragmentManager fm = getSupportFragmentManager(); 
    F f = new F(); 
    fm.beginTransaction() 
      .add(R.id.content, f) 
      .commit(); 
} 

टुकड़ा एफ

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // do some stuff 
    FragmentManager fm = getChildFragmentManager(); 
    FragmentTransaction transaction = fm.beginTransaction(); 
    ChildFragment childFragment = new ChildFragment(); 
    childFragment.setTargetFragment(this, 1); 
    transaction.add(R.id.f, childFragment); 
    transaction.commit(); 

    return view; 
} 

बच्चे टुकड़ा का कोड समस्या के लिए प्रासंगिक तो मैं इसे पोस्ट नहीं होते नहीं है।

इस कोड को सब कुछ का उपयोग ठीक से काम करने लग रहा था जब तक मैं Firebase एकीकृत और निम्न क्रैश रिपोर्ट

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.test/com.test.test.A}: java.lang.IllegalStateException: Fragment no longer exists for key android:target_state: index 1 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429) 
    at android.app.ActivityThread.access$800(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) 
    at android.os.Handler.dispatchMessage(Handler.java:110) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:5341) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641) 
    at dalvik.system.NativeStart.main(Native Method) 

हो रही सबसे पहले मैं अपवाद पुन: पेश नहीं कर सका शुरू लेकिन थोड़ी देर के लिए परीक्षण के बाद मैंने पाया कि अगर डेवलपर विकल्प गतिविधियां न रखें ऐसा होता है जब भी मैं गतिविधि को पृष्ठभूमि में लाता हूं और इसे फिर से शुरू करता हूं। मुझे लगता है कि सामान्य स्थिति में यह तब होता है जब गतिविधि पृष्ठभूमि में डाल दी जाती है और ऐप नष्ट हो जाता है।

कुछ शोध करने के बाद मैं इस निष्कर्ष पर पहुंचा कि दुर्घटना का वास्तविक कारण यह है कि खंड एफ को इसके बच्चे के लिए लक्ष्य खंड के रूप में सेट किया गया है। मैं पुष्टि कर सकता हूं कि यदि मैं लक्ष्य खंड सेट नहीं करता हूं तो क्रैश नहीं होता है।

मुझे पूर्ण यकीन नहीं है लेकिन ऐसा लगता है कि दुर्घटना का कारण यह है कि बाल टुकड़ा और इसका लक्ष्य खंड अलग-अलग टुकड़े प्रबंधक में हैं। तो मैंने कोशिश की पहली बात गतिविधि के टुकड़े प्रबंधक में सभी टुकड़े रखना था।

टुकड़ा एफ

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // do some stuff 
    // I do not want to use private fragment manager but rather use the activity's 
    // FragmentManager fm = getChildFragmentManager(); 
    FragmentManager fm = getFragmentManager(); 
    // do the other stuff 
} 

यह समस्या हल हो। लेकिन एक और के लिए नेतृत्व। जब मैं गतिविधि से टुकड़ा हटा देता हूं (मैं इसे किसी अन्य टुकड़े से बदलना चाहता हूं)। बच्चा खंड अपने राज्य को बचाने में असफल रहा क्योंकि इसमें इसके मूल खंड का संदर्भ है जिसे प्रबंधक से हटा दिया गया है।

Process: com.test.test, PID: 11047 java.lang.IllegalStateException: Failure saving state: ChildFragment{423c10f0 #1 id=0x7f0b0058} has target not in fragment manager: F{423c0f88} 
    at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:2618) 
    at android.support.v4.app.FragmentController.saveAllState(FragmentController.java:134) 
    at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:571) 
    at android.support.v7.app.AppCompatActivity.onSaveInstanceState(AppCompatActivity.java:515) 
    at android.app.Activity.performSaveInstanceState(Activity.java:1157) 
    at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1229) 

मैं जब अपनी मूल निकाल दिया जाता है, लेकिन मुझे लगता है यह यह करने के लिए सही तरीके से नहीं है, सब के बाद मुझे लगता है कि ऐसा करने के लिए उचित तरीके से यह है गहराई में जाने के लिए और बच्चे टुकड़ा दूर करने की कोशिश कर सकते हैं getChildFragmentManager() का उपयोग कर।

किसी भी मदद की, सुझाव, विषय के संबंध में दिशा-निर्देश बहुत सराहना की जाएगी।

+0

आप केवल एक ही स्थान से टुकड़े क्यों नहीं बनाते और जोड़ते हैं - गतिविधि ए? – helleye

+0

यह टुकड़ा पुन: प्रयोज्य नहीं करेगा। सभी गतिविधियों जो टुकड़े को जोड़ती हैं उन्हें भी बच्चे के टुकड़े को जोड़ना पड़ता है। –

+0

क्या आपने यह https://code.google.com/p/android/issues/detail?id=54520 – Krish

उत्तर

3

मैं इस तरह अपने कोड को बदल दिया है और यह मेरे लिए काम कर रहा है, इस तरह ActivityA बदलें,

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity); 

     FragmentManager fm = getSupportFragmentManager(); 
     if (fm.findFragmentById(R.id.content) == null) { 
      F f = new F(); 
      fm.beginTransaction() 
        .add(R.id.content, f) 
        .commit(); 
     } 
    } 

और तुम ChildFragment टुकड़ा के लिए setTargetFragment की तरह अपने पिछले कार्यान्वयन का उपयोग कर सकते हैं। इसने आपके द्वारा प्रश्न में उल्लिखित पहला अपवाद हल किया।

+0

@MojoRisin क्या आपने मेरा जवाब करने की कोशिश की? – Krish

+0

ऐसा प्रतीत होता था कि मैं गलत जगह पर समाधान ढूंढ रहा था। जैसा कि आपने बताया कि समस्या यह थी कि अगर मैं पहले से ही वहां हूं तो मैं खंड को जोड़ रहा था। –

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