6

aşağıdaki davayı basitleştirecek soruna odaklanmak amacıyla - Ben bir etkinlik var A ve bir parça Başka bir parça ekleyen F sayılı Avrupa Patent başvurusu Çocuk. Her basitleştirilmiş kod yüzden post it olmaz birİstisna [Fragment artık anahtar android için var: 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(); 
} 

Fragment F

@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; 
} 

çocuk fragmanının kod sorunla ilgili değildir

Aktivitesi. Ben Firebase entegre ve ilk ben istisna yeniden olamazdı azından aşağıdaki kazasında raporu

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) 

almaya başlamak kadar bu kod her şeyi kullanarak

düzgün çalışması gibiydi ama bir süre test ettikten sonra buldum ki eğer geliştirici seçeneği Etkinlikleri Saklamayın, aktiviteyi arka plana her getirdiğimde ve devam ettirildiğinde gerçekleşir. Ben normal durumda bu faaliyet arka planda koymak ve uygulama imha edilirken olacak düşünüyorum. Bazı araştırmalar yaptıktan sonra, çarpmanın asıl nedeninin, fragman F'nin çocuk için hedef fragman olarak belirlendiği sonucuna varıyorum. Hedef parçayı ayarlamazsam, çarpmanın oluşmadığını doğrulayabilirim.

Mutlak emin değilim ama kaza sebebi, Çocuk Parçası ve hedef parçasının farklı FragmentManager'larda olmasıdır. Bu yüzden denediğim ilk şey, tüm parçaları faaliyetteki parça yöneticisine koymaktı.

Fragment F

@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 
} 

Bu sorunu çözdü. Ama başka birine yol açıyor. Parçayı aktiviteden çıkardığımda (onu başka bir parça ile değiştirmek istiyorum). Alt bölüm, yöneticiden kaldırılan ana parçasına bir referansı olduğu için, durumunun durumunu kaydedemedi.

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) 
üst kaldırılır ama uygun yolu yapmak düşünüyorum sonuçta bu, bu bunu yapmak için doğru yolu olmayan bir his var ne zaman derine gitmeye ve çocuk parçasını çıkarmak için deneyebileceğiniz

getChildFragmentManager() kullanarak.

Konuyla ilgili her türlü yardım, öneri, yönerge çok takdir edilecektir.

+0

Neden sadece bir yerden fragman oluşturup eklemeyin - etkinlik A? – helleye

+0

Parçayı tekrar kullanılamaz hale getirecek. Fragmanı ekleyen tüm aktiviteler de çocuk parçasını eklemelidir. –

+0

Bu https://code.google.com/p/android/issues/detail?id=54520 – Krish

cevap

3

böyle kodunuzu değişti ve benim için çalışıyor, böyle Değişim 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(); 
     } 
    } 

Ve ChildFragment fragmanı için setTargetFragment gibi önceki uygulama kullanabilirsiniz. Bu soruda bahsettiğiniz ilk istisnayı çözdü.

+0

@MojoRisin Cevabımı denediniz mi? – Krish

+0

Yanlış yerde bir çözüm aradığı anlaşılıyordu. Sorunu belirttiğiniz gibi, eğer zaten var ise, parçayı ekliyordum. –

İlgili konular