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.
Neden sadece bir yerden fragman oluşturup eklemeyin - etkinlik A? – helleye
Parçayı tekrar kullanılamaz hale getirecek. Fragmanı ekleyen tüm aktiviteler de çocuk parçasını eklemelidir. –
Bu https://code.google.com/p/android/issues/detail?id=54520 – Krish