6

アクティビティのonResumeメソッドでフラグメントを決定して表示しようとしていますが、以前に追加されたフラグメントが再度選択された場合、アクティビティは空白になります。

サンプル コード (1 つのフラグメントを含む):

@Override
protected void onResume(){
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction();

    trans.replace(R.id.myLayout, fragA);

    trans.commit();
    getSupportFragmentManager().executePendingTransactions();
}

上記のコードでは、アクティビティが初めて作成されたときにfragAが正しく表示されますが、 ( onResumeHome Keyを再度呼び出すために) を押してアクティビティに戻ると、すべてが空白になります (fragA が削除されたようです) )。

以前に追加されたフラグメントを置き換えると、それ自体が削除されますか? または、フラグメントがそれ自体で置き換えられた場合にフラグメントを失わないようにする方法は?

4

4 に答える 4

5

フラグメントをそれ自体に置き換えることはできません。置換の前半は、その ID の前のフラグメントの削除です。フラグメントが削除されると、フラグメント マネージャーによって追加または使用できなくなります (そのため、置換の追加部分が正しく機能しません)。

ユースケースに応じて、次の 2 つのオプションがあります。

  1. 既存のインスタンスを再利用する代わりに新しいフラグメントを作成する
  2. 他の方法を使用して、フラグメントを置き換える必要があるかどうかを確認します

最後に、おそらく executePendingTransactions を呼び出す必要はありません。

于 2013-02-19T14:02:09.450 に答える
4

あなたが試すことができます:

if( !(getSupportFragmentManager().findFragmentById(R.id.myLayout) instanceof FragmentA) ) {
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction();

    trans.replace(R.id.myLayout, fragA);

    trans.commit();
}

そして、fragA は FragmentA クラス オブジェクトであると仮定します。

于 2013-02-19T14:21:18.957 に答える
3

最後に、フラグメントを置き換える前にチェックを入れなければなりませんでした。(すでに追加された)フラグメントが再度置換を要求された場合、すでに追加されているかどうかを確認してから置換を無視し、それ以外の場合は続行する必要がありました。例えば:

@Override
protected void onResume() {
    if (!fragA.isAdded()) {
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.replace(R.id.myLayout, fragA);
        trans.commit();
        //getSupportFragmentManager().executePendingTransactions();   //unnecessary
    }
}
于 2013-02-20T13:03:07.877 に答える