16

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

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

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

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

バックスタックを反復して各フラグメントを印刷しましたが、メニューのあるフラグメントではありません。

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

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

アップデート:

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

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

そして削除のために:

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

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

注 2:フラグメントの onDestroy() メソッドに入っていることがわかっているので、破棄されると思われます。しかし、メイン アクティビティが再開されたときに再度呼び出される理由がわかりません。

4

6 に答える 6

6

popBackStackあなたの最後のを元に戻すだけFragmentTransactionです。

を使用する場合はFragmentTransaction.addpopBackStackを呼び出すだけFragmentTransacetion.removeです。

しかし、あなたが を呼び出すとFragmentTransaction.replacepopBackStackが呼び出さFragmentTransaction.removeれ、FragmentTransaction.add

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

于 2014-05-06T16:14:06.413 に答える
0

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

それ以外の場合は、フラグメントの交換トランザクションを使用して移行をスムーズにし、手間のかからないアプローチについては、 https: //stackoverflow.com/a/23013075/3176433 を参照してください

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

于 2014-05-06T16:11:13.740 に答える