2

フラグメントをバックスタックに追加できないのはなぜですか?

@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)
4

4 に答える 4

10

アクションバーのタブを使用していて、タブにバインドされたフラグメントをバックスタックに追加する必要があります。通常、これは禁止されています(ほとんどの場合、理解できます)。アクションバーのタブをバックスタックに追加することはできません。アプリケーションがタブベースの場合は問題ありませんが、特定の状況でのみタブを表示し、他の状況でタブを非表示にする場合、この動作は良くありません(そして、Googleがタブを許可しない理由がわかりません).....多分あなた最初のタブをバックスタックに追加する必要がありますが(私の状況)、このような場合、onTabSelectedではトランザクションをバックスタックに追加できません。このメソッド呼び出し内でaddToBackStackがブロックされているため、例外がスローされます( FragmentTransaction内にdisallowAddToBackStackメソッドがあります。これはまさにそれを実行します...私はその制約に完全に同意しません)。

于 2012-11-22T16:42:48.450 に答える
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();
}
于 2011-11-22T19:06:41.840 に答える
0

を取り除きtransaction、代わりにFragmentTransaction、コールバックで提供されたものを使用します。FragmentTransactionすでに手渡されている場合は、新しいものをインスタンス化する必要はありません。呼び出し先に必要なものをすべて渡してからft.addToBackstack();ft.commit();

于 2011-11-22T17:42:20.713 に答える
0

コードの唯一の問題は、トランザクションを「正しく」作成したものの、決して使用しないことです。指定されたトランザクション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();
    }

TabListener は自動コミットのみを行うため、適切に行ったように、transaction.replace(...バイスの使用にft.replace(...も注意してください。commit()FragmentTransaction ft

また、ここの TabListener API ドキュメントでサポートされていないバックスタックへの追加について読むことができます: http://developer.android.com/reference/android/app/ActionBar.TabListener.html

于 2013-01-17T23:05:12.090 に答える