【问题标题】:FragmentTabHost "Activity has been destroyed"FragmentTabHost "活动已被破坏"
【发布时间】:2013-07-22 07:31:12
【问题描述】:

我有 3 个片段选项卡,片段 1、片段 2 和片段 3。我在 fragment2 中创建了另一个片段选项卡。问题是每当我重新选择包含片段选项卡的片段 2 时,我的应用程序就会崩溃,并显示如下所示的 LOGCAT。我在这个链接Getting the error "Java.lang.IllegalStateException Activity has been destroyed" when using tabs with ViewPager 上关注了stackoverflow 中的一个问题,但它似乎也不起作用。另外,我是否导入了正确的库“import java.lang.reflect.Field;”?

fragment2.java

import com.actionbarsherlock.app.SherlockFragment;
import android.os.Bundle;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends SherlockFragment{
     private FragmentTabHost mTabHost;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            mTabHost = new FragmentTabHost(getSherlockActivity());
            mTabHost.setup(getSherlockActivity(), getChildFragmentManager(), R.layout.fragmenttab2);

            mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
                    Fragment1.class, null);
            mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
                     Fragment2.class, null);
            mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
                     Fragment3.class, null);

            return mTabHost;
        }

        @Override
        public void onDestroyView() {
            super.onDestroyView();
            mTabHost = null;
        }


}

LogCat:

 07-22 16:18:50.668: E/AndroidRuntime(29774): FATAL EXCEPTION: main
07-22 16:18:50.668: E/AndroidRuntime(29774): java.lang.IllegalStateException: Activity has been destroyed
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:278)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.view.View.dispatchAttachedToWindow(View.java:9953)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2198)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2206)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3376)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.view.ViewGroup.addView(ViewGroup.java:3208)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.view.ViewGroup.addView(ViewGroup.java:3165)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.view.ViewGroup.addView(ViewGroup.java:3145)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:922)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.os.Handler.handleCallback(Handler.java:605)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.os.Looper.loop(Looper.java:137)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at android.app.ActivityThread.main(ActivityThread.java:4507)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at java.lang.reflect.Method.invokeNative(Native Method)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at java.lang.reflect.Method.invoke(Method.java:511)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
07-22 16:18:50.668: E/AndroidRuntime(29774):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android android-fragments android-nested-fragment


    【解决方案1】:

    编写此代码时:

       Field childFragmentManager = Fragment2.class.getDeclaredField("mChildFragmentManager");
    

    表示你想得到你在 Fragment2 中声明的文件。

    我可以在 Fragment2 中看到 mChildFragmentManager 字段。

    如果你确定这个文件是在超类中声明的,你应该使用 Fragment2.class.getField

    【讨论】:

    • 尝试替换 Fragment2.class.getDeclaredField("mChildFragmentManager"); by Fragment2.class.getField("mChildFragmentManager");
    【解决方案2】:

    试试这个 childFragmentManager

    childeFragmentManager = getChildFragmentManager().

    它是在 4.2 发布后添加到支持库中的,因为在此之前不支持嵌套片段。

    来源 http://developer.android.com/about/versions/android-4.2.html#NestedFragments

    【讨论】:

    • 抱歉,请问我应该把这个放在哪里?
    • 抱歉,您编辑了您的问题。在上一次编辑中,您使用反射 (Field) 在 onDetach() 中查找 FragmentManager。所以代替那个使用这个。我不知道您如何在片段中添加子片段。但是不要使用getFragmentManager() 在片段中添加片段,而是使用getChildFragmentManager()
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多