Android嵌套片段问题“java.lang.IllegalStateException:活动已被破坏”

正如你可能知道Android支持Nested Fragments,也是通过API级别17的支持库。所以基本上我试图将嵌套的片段添加到一个ViewPager的片段,并熟悉这个新的好function。

一切工作如预期的第一次应用程序启动即我可以添加子片段,导航通过这些片段,处理后端堆栈等。

但问题是,当我通过单击“返回”button离开应用程序并重新启动应用程序时,大多数情况下我都会遇到下面的exception情况,但并非总是如此:

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) 

整个项目在这里可用。

在某些时候活动可以为空吗? 我的意思是当我调用getChildFragmentManager(),不应该活动被附加到片段pipe理器? 任何build议将不胜感激。

关于应用程序的更多细节,

ViewPager承载两个片段实例:FragRegular和FragWrapper。 第一个只是一个简单的无用片段; 第二个FragWrapper充当父代片段,即子片段的容器。 以下是FragWrapper的布局:

 <?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> 

所以基本上,第一个子片段被添加到FragWrapper的onActivityCreated()callback方法的FragWrapper中,随后的子片段在运行时被添加,触发一个button单击。 这是FragWrapper类的样子:

 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(); } } 

Solutions Collecting From Web of "Android嵌套片段问题“java.lang.IllegalStateException:活动已被破坏”"