FragmentTransaction нельзя добавлять в задний стек?

почему мои фрагменты не могут быть добавлены в задний стек?

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

ошибка логарифма

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)

person tyczj    schedule 22.11.2011    source источник


Ответы (4)


Избавьтесь от своего transaction и вместо этого используйте FragmentTransaction, указанный в обратном вызове. Нет необходимости создавать новый экземпляр FragmentTransaction, когда он уже передан вам. Передайте все, что хотите, в свой вызов ft.addToBackstack();, а затем позвоните ft.commit();

person LuxuryMode    schedule 22.11.2011

Вы используете вкладки панели действий и хотите, чтобы фрагменты, привязанные к вкладкам, добавлялись в задний стек, что обычно запрещено (и в большинстве случаев это понятно). Вкладки панели действий нельзя добавлять в задний стек. Если ваше приложение основано на вкладках, это нормально, но если вы отображаете вкладки только в определенных ситуациях, а в других вы их скрываете, это нехорошо (и я не понимаю, почему Google этого не позволяет). ..... может быть, вы нужно, чтобы первая вкладка была добавлена ​​в задний стек (моя ситуация), но в таком случае onTabSelected не позволит вам добавить транзакцию в задний стек, он выдаст исключение, потому что addToBackStack заблокирован внутри этого вызова метода ( внутри FragmentTransaction есть метод disallowAddToBackStack, который делает именно это... Я полностью не согласен с этим ограничением).

person Sergio Buonanno    schedule 22.11.2012
comment
Святая плотная стена текста, бэтмен! Возможно, вы можете отредактировать некоторые абзацы? - person Martijn Pieters; 22.11.2012

Я не понимаю, почему вы создаете новый экземпляр 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();
}
person blindstuff    schedule 22.11.2011

Единственная проблема в вашем коде заключается в том, что вы «правильно» создаете транзакцию, но никогда ее не используете. Предоставленная транзакция 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

Кроме того, вы можете прочитать о том, что добавление в задний стек не поддерживается в документации по API TabListener здесь: http://developer.android.com/reference/android/app/ActionBar.TabListener.html

person Matt    schedule 17.01.2013