【问题标题】:FragmentTransaction is not allowed to be added to back stack?不允许将 FragmentTransaction 添加到后台堆栈?
【发布时间】:2012-01-04 02:15:29
【问题描述】:

为什么我的片段不能被添加到后台堆栈?

@Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        FragmentTransaction transaction = null;


            ListFragment newListFragment = new bListFragment();
            Fragment newFragment = new EntryFrag();
            transaction = getFragmentManager().beginTransaction();
            ft.replace(R.id.frameOne, newListFragment);
            ft.replace(R.id.frameTwo, newFragment);


        ft.addToBackStack(null);
        transaction.commit();
    }

logcat 错误

11-22 12:30:41.370: E/AndroidRuntime(13989): FATAL EXCEPTION: main
11-22 12:30:41.370: E/AndroidRuntime(13989): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tyczj.bowling/com.tyczj.bowling.Tabs}: java.lang.IllegalStateException: This FragmentTransaction is not allowed to be added to the back stack.
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1751)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.ActivityThread.access$1500(ActivityThread.java:122)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.os.Looper.loop(Looper.java:132)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.ActivityThread.main(ActivityThread.java:4028)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at java.lang.reflect.Method.invokeNative(Native Method)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at java.lang.reflect.Method.invoke(Method.java:491)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at dalvik.system.NativeStart.main(Native Method)
11-22 12:30:41.370: E/AndroidRuntime(13989): Caused by: java.lang.IllegalStateException: This FragmentTransaction is not allowed to be added to the back stack.
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.BackStackRecord.addToBackStack(BackStackRecord.java:422)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at com.tyczj.bowling.Tabs$TabListener.onTabSelected(Tabs.java:155)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:483)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at com.android.internal.app.ActionBarImpl.setSelectedNavigationItem(ActionBarImpl.java:303)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at com.android.internal.app.ActionBarImpl.setNavigationMode(ActionBarImpl.java:883)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at com.tyczj.bowling.Tabs.onCreate(Tabs.java:32)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
11-22 12:30:41.370: E/AndroidRuntime(13989):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)

【问题讨论】:

    标签: android android-fragments illegalstateexception


    【解决方案1】:

    您正在使用操作栏选项卡,并且希望将绑定到选项卡的片段添加到后台堆栈,这通常是被禁止的(在大多数情况下这是可以理解的)。不允许将操作栏选项卡添加到后台堆栈。如果您的应用程序是基于选项卡的,那没关系,但是如果您仅在特定情况下显示选项卡,而在其他情况下您将其隐藏,则这种行为不好(我不明白为什么 Google 不允许这样做).....也许你需要将第一个选项卡添加到后台堆栈(我的情况),但在这种情况下 onTabSelected 将不允许您将事务添加到后台堆栈,它会抛出异常,因为 addToBackStack 在此方法调用中被阻塞( FragmentTransaction 中有一个方法 disallowAddToBackStack 正是这样做的......我完全不同意这个约束)。

    【讨论】:

    • 神圣密密麻麻的文字墙,蝙蝠侠!你可以编辑一些段落吗?
    【解决方案2】:

    我不明白为什么要在函数中实例化一个新的 FragmentTransaction,只需使用作为参数传递的那个。我没有对此进行测试,但我很确定它应该可以工作。

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
            ListFragment newListFragment = new bListFragment();
            Fragment newFragment = new EntryFrag();
            ft.replace(R.id.frameOne, newListFragment);
            ft.replace(R.id.frameTwo, newFragment);
            ft.addToBackStack(null);
            ft.commit();
    }
    

    【讨论】:

      【解决方案3】:

      摆脱您的transaction,而是使用回调中提供的FragmentTransaction。当一个已经交给你时,没有必要实例化一个新的FragmentTransaction。将您想要的任何内容传递给ft.addToBackstack();,然后调用ft.commit();

      【讨论】:

        【解决方案4】:

        您的代码中唯一的问题是您“正确”地创建了一个事务,但您从未使用它。提供的事务FragmentTransaction ft 无法添加到后台堆栈,因为侦听器不支持它,但是这应该可以:

        @Override
            public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        
                    ListFragment newListFragment = new ListFragment();
                    Fragment newFragment = new EntryFrag();
        
                    FragmentTransaction transaction = getFragmentManager().beginTransaction();
                    transaction.replace(R.id.frameOne, newListFragment);
                    transaction.replace(R.id.frameTwo, newFragment);
        
        
                    transaction.addToBackStack(null);
                    transaction.commit();
            }
        

        注意transaction.replace(...的使用,副ft.replace(...你也必须commit()这个你自己,就像你做的那样,因为TabListener只会自动提交FragmentTransaction ft

        此外,您可以在此处阅读有关在 TabListener API 文档中不支持添加到后台堆栈的信息:http://developer.android.com/reference/android/app/ActionBar.TabListener.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-07
          • 1970-01-01
          • 1970-01-01
          • 2015-09-30
          • 1970-01-01
          相关资源
          最近更新 更多