Android Imbriquée Fragments de Question “de java.lang.IllegalStateException: l'Activité a été détruit”

Comme vous le savez peut Android prend en charge Imbriquée Fragments, également par le biais du soutien de la bibliothèque avec l'API de niveau 17. Donc, fondamentalement, je suis en train d'ajouter imbriquée des fragments dans l'une des ViewPager fragments, et de se familiariser avec cette nouvelle fonctionnalité intéressante.

Tout fonctionne comme prévu lors de la première application se lance, j'.e je peux ajouter un enfant fragments, de naviguer à travers ces fragments, de gérer la pile de retour etc..

Mais le problème est que lorsque je quitte l'application en cliquant sur bouton "Retour" et relancer l'appli, j'ai obtenu l'exception suivante, la plupart du temps, pas toujours :

java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at com.cnlms.andnestedfragments.ui.fragments.FragWrapper.addChildFragment(FragWrapper.java:145)
at com.cnlms.andnestedfragments.ui.fragments.FragWrapper.onActivityCreated(FragWrapper.java:96)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15172)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
at android.view.View.measure(View.java:15172)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

L'ensemble du projet est disponible ici.

Peut que l'activité est nulle à un certain point? Je veux dire quand je l'appelle getChildFragmentManager(), ne devrait-on pas que l'activité est attaché à la Fragment de Manager? Toute suggestion sera grandement apprécié.

Plus de détails sur l'application,

ViewPager accueille deux fragment instances: FragRegular et FragWrapper. La première est qu'une simple inutiles fragment; la seconde, FragWrapper, agit comme un parent fragment de je.e le conteneur pour l'enfant fragments. Voici ce que FragWrapper de la mise en page ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--
Adds nested child fragments when clicked
-->
<Button
android:id="@+id/btn_go_deep"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Go Nesty!"/>
<!--
Nested Fragment Container
-->
<FrameLayout
android:id="@+id/frag_container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_above="@id/btn_go_deep"/>
</RelativeLayout>

Donc, fondamentalement, le premier enfant fragment est ajouté dans FragWrapper dans le onActivityCreated() la méthode de rappel de la FragWrapper, et de l'enfant fragments sont ajoutés au moment de l'exécution, déclenché par un clic de bouton. Voici ce que FragWrapper classe ressemble à:

public final class FragWrapper extends BaseFragment {
/**
*
*  The Wrapper Fragment that hosts nested child fragments.
*
*  First child fragment is added in onActivityCreated() callback
*
*  More child fragments can be added at runtime by clicking 'Go Nesty!'
*  button.
*
*/
/**
*  Holds back stacked fragment tags
*/
private Stack<String> backStack;
/**
*  Child Fragment Manager
*/
private FragmentManager fm;
/**
*  Fragment Tags
*/
private int fragCount = 1;
private static FragWrapper instance;
public static FragWrapper getInstance() {
if (instance == null) {
instance = new FragWrapper();
}
return instance;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_wrapper, container, false);
view.findViewById(R.id.btn_go_deep).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
*  Adds nested child fragments
*/
fragCount+=1;
addChildFragment(
FragChild.newInstance(fragCount),
String.valueOf(fragCount),
true
);
}
});
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
/**
*  Add Initial Fragment
*/
addChildFragment(
FragChild.newInstance(fragCount),
String.valueOf(fragCount),
false
);
}
private void addChildFragment(final Fragment fragment, final String fragmentTag, final boolean addToBackStack) {
/**
*  initialize child fragment manager
*/
if (fm == null) fm = getChildFragmentManager();
/**
*  Starts a new transaction
*/
FragmentTransaction ft = fm.beginTransaction();
/** 
*  Hide lastly added fragment
*/
if (backStack != null  && !backStack.isEmpty()) {
ft.hide(fm.findFragmentByTag(backStack.peek()));
}
/** 
*  Add new fragment
*/
ft.add(R.id.frag_container, fragment, fragmentTag );
/**
*  Add to back stack
*/
if (addToBackStack) {
ft.addToBackStack(null);
}
/**
*  Commit transaction
*/
ft.commit();
/**
* Save fragment tag
*/
if (backStack == null) backStack = new Stack<String>();
backStack.push(fragmentTag);
}
public boolean popFragment() {
/**
*  Allow this fragment to consume the back button click
*/
if (backStack != null   && !backStack.isEmpty()) {
backStack.pop();
fragCount-=1;
}
return fm != null && fm.popBackStackImmediate();
}
@Override
public boolean backPressed() {
return popFragment();
}
}
Est-il une raison pour faire de votre FragWrapper un singleton en maintenant à ce point de référence fixe(qui vous ne devriez vraiment pas faire)?
Je l'utilise comme un singleton pour y accéder plus tard dans la FragmentActivity.onBackPressed() et de permettre à ces fragments de consommer de l'arrière de la presse.
Votre code n'est pas correct et qu'il va aller mal dans certaines situations. J'ai modifié votre projet exemple de quelque chose qui doit fonctionner, vous pouvez le trouver ici dl.dropbox.com/u/95923721/AndroidNestedFragmentsj.7z . Check it out.
je vous remercie pour votre commentaire et de l'effort. Votre exemple de projet fonctionne comme prévu. J'ai aussi mis à jour mon code de façon similaire, sans détenir les références statiques pour fragment instances et Cela semble ok pour l'instant.
je suis en utilisant le même projet de démonstration. et face à ce genre de problème,Pourriez-vous fournir les mises à jour dont vous avez corrigé.

OriginalL'auteur Can Elmas | 2013-01-14