FragmentTransaction не разрешено добавлять в задний стек? - PullRequest
2 голосов
/ 22 ноября 2011

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

@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 error

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)

Ответы [ 4 ]

10 голосов
/ 22 ноября 2012

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

2 голосов
/ 22 ноября 2011

Я не понимаю, почему вы создаете новую 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();
}
0 голосов
/ 18 января 2013

Единственная проблема в вашем коде состоит в том, что вы «правильно» создаете транзакцию, но затем никогда не используете ее. Предоставленная транзакция FragmentTransaction ft не может быть добавлена ​​в backstack, поскольку она не поддерживается слушателем, однако это должно работать:

@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

0 голосов
/ 22 ноября 2011

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

...