web-dev-qa-db-ja.com

FragmentManager popBackStackがフラグメントを削除しない

フラグメントを使用してメニューナビゲーションを実装しています。だから私はホームから始め、次にユーザーはさまざまなセクションと各セクションの詳細に移動できます。

ユーザーがセクションを変更したら、fragmentmanagerバックスタックでpopを呼び出してHomeに到達し、新しいセクションをロードします。

これはすべて期待どおりに機能しています。しかし、私はこの問題を抱えています:

  1. onResume()でsetHasOptionsMenu(true)を呼び出すセクションをロードします
  2. 別のセクションをロードします(スタックから抜け出そうとする古いセクション)。大丈夫そうです。メニューは表示されません
  3. アプリケーションを終了します(たとえば、Android Laucherアクティビティ)に移動してから戻ると、正しいセクションが表示されますが、古いフラグメントのメニューが表示されています。

私はバックスタックを繰り返し、各フラグメントを印刷しましたが、メニューにはフラグメントがありません。

OnResume()メソッド(setHasOptionsMenu(true)がフラグされている場所)にデバッグマークを付けて、実際にここに入力したので、フラグメントはまだどこかにあります。

私が何か間違っているのかどうか、どうすればそれを解決できるのか知りたい

更新:

このコードを使用して新しいフラグメントをロードしています

fm.beginTransaction()
    .add(container, sectionFragment.getFragment())
    .addToBackStack(sectionFragment.getFragmentName())
    .commit();

そして削除のために:

private void clearStack(){
int count = fm.getBackStackEntryCount();
    while(count > 1){
        fm.popBackStack();
        count--;
    }
}

注1:詳細セクションから戻ったときにフラグメントの状態を失いたくないので、代わりにaddを使用しています。別の異なるセクションをロードするとき、clearStackを呼び出してスタックを1までポップし、新しいフラグメントをロードします。最後に、executePendingTransactions()を呼び出して、トランザクションからフラグメントを削除して終了します。

注2:フラグメントのonDestroy()メソッドに入力されているので、破棄される可能性があります。しかし、メインアクティビティが再開したときに、なぜ再び呼び出されるのかわかりません。

14
edrian

スタックのフラグメントを追加および削除するロジックには問題がないことがわかりました。

問題は、フラグメントの一部がその中に別のフラグメントをロードしたことでした(ViewPagerコンポーネントが含まれていました)。次に、フラグメントが削除されると、これらのフラグメントも削除されると思いました。

これは、getChildFragmentManager()メソッドを使用する場合にのみ当てはまります。このメソッドは、他のフラグメント内にフラグメントをロードするときに使用する必要があります。そうでない場合、フラグメントはフラグメントアクティビティに関連付けられます。

22
edrian

私はこの質問を見つけました、なぜなら電話した後

_fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
_

このコードfragmentManager.getFragments().size()は、スタックにあったフラグメントmeの最大数を返します。 nullのすべてのフラグメントをチェックしました。私の場合、一部のフラグメントがnullであることがわかりました。多分それは誰かを助けるでしょう)

6
Malder

popBackStackは最後のFragmentTransactionを元に戻します。

FragmentTransaction.addを使用する場合、popBackStackFragmentTransacetion.removeを呼び出すだけです。

ただし、FragmentTransaction.replaceを呼び出すと、popBackStackFragmentTransaction.removeおよびFragmentTransaction.addを呼び出します

「注1」の場合:FragmentTransaction.replaceはフラグメントの状態を変更しません。

5
Neige

popBackStack()がフラグメントを削除しないという同様の問題がありました。しかし、間違ったFragmentManagerを呼び出したことがわかりました。getSupportFragmentMananger()ではなくgetFragmentManager()を呼び出さなければなりませんでした。

0
Aviv Cohen

本当に一度にフラグメントを削除したい場合は、以下に従ってください: 異なるタイプのフラグメントを置き換える方法?

それ以外の場合は、フラグメントの置換トランザクションを使用して、移行をスムーズにし、無料でアプローチできます。詳細は https://stackoverflow.com/a/23013075/31764 を参照してください

フラグメントのライフサイクルも理解してください http://developer.Android.com/guide/components/fragments.html

0
zIronManBox