6

単一の FragmentActivity を使用して、単純なフラグメント ベースのアプリケーションを開発しています。アプリケーションの各「画面」はフラグメントに含まれており、アプリケーションの起動時にすべてのフラグメントがコンテナー レイアウトに追加されます。

// Set up fragments in Main Activity
fragMan = getFragmentManager();
FragmentTransaction ft = fragMan.beginTransaction();
ft.add(R.id.fragment_container, settingsFragment);
ft.add(R.id.fragment_container, mapFragment);
ft.add(R.id.fragment_container, tracksFragment);
ft.add(R.id.fragment_container, waypointsFragment);
ft.commit();

遷移は、現在表示されているフラグメントを非表示にしてから、適切なフラグメントを表示することによって実行されます。

ft = fragMan.beginTransaction();
ft.show(mapFragment);
ft.addToBackStack(null);
ft.commit();

これはすべて正常に機能しますが、戻るボタンが押されると、どの画面が表示されているか、バックスタックに追加された以前のトランザクションに関係なく、アプリケーションが終了します。

バックスタックがレコードを適切に蓄積していることを確認し、フラグメントを非表示/表示するのではなく置換する、変数に格納するのではなくフラグメントの新しいインスタンスを作成するなど、さまざまな遷移方法のバリエーションを試しました。私が知ることができるように、私のコードは私が見つけることができるすべてのチュートリアルと例に一致し、おそらく標準的な実装が他の人にとって「うまくいく」ため、同様の質問/同様の問題の例を見つけることさえできませんでした.

マニフェストのプロパティ(かなり徹底的に調査しました)や、アプリケーションの設定方法に固有のものなど、アプリケーションレベルの問題である可能性があり、戻るボタンが正しく機能しない可能性があります。トランジションを手動で処理するために onBackPressed をオーバーライドできますが、これは非常に醜い回避策のようです。これが期待どおりに動作しない理由についてのアイデアはありますか? ちなみに、これはJelly Beanを実行しているNexus 7にあります。

4

3 に答える 3

0

これで問題が解決するかどうかはわかりませんが、最初からすべてのフラグメントを追加する必要はないと思います。

また、(少なくとも互換性ライブラリでは)replace メソッドが非常にバグが多いように見えるため、最初に既存のフラグメントを削除してから新しいフラグメントを追加することをお勧めします。

フラグメントを変更するために使用するコードは次のとおりです。

/**
 * Changes the detail fragment of this activity. This is how all content is presented in this app.
 * @param fragment
 * @param animated
 * @param addCurrentFragmentToBackStack
 */
private void changeDetailFragment(Fragment fragment,boolean animated,boolean addCurrentFragmentToBackStack)
{
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        if (animated)
            transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);

    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);


    String fragName = "NONE";

    if (currentFrag!=null)
        fragName = currentFrag.getClass().getSimpleName();


    if (currentFrag != null)
    {

        transaction.remove(currentFrag);
    }


    transaction.add(R.id.detailFragment,fragment);


    if (addCurrentFragmentToBackStack)
    {
        Log.i("APP_NAME","Adding: " + fragName + " to the backstack");
        transaction.addToBackStack(null);
    }
    else
    {
        Log.i("APP_NAME","Not adding: " + fragName + " to the backstack");
    }



    transaction.commit();

}

お役に立てれば。

于 2012-10-02T13:47:00.633 に答える