フラグメントを使用してメニューナビゲーションを実装しています。だから私はホームから始め、次にユーザーはさまざまなセクションと各セクションの詳細に移動できます。
ユーザーがセクションを変更したら、fragmentmanagerバックスタックでpopを呼び出してHomeに到達し、新しいセクションをロードします。
これはすべて期待どおりに機能しています。しかし、私はこの問題を抱えています:
私はバックスタックを繰り返し、各フラグメントを印刷しましたが、メニューにはフラグメントがありません。
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()メソッドに入力されているので、破棄される可能性があります。しかし、メインアクティビティが再開したときに、なぜ再び呼び出されるのかわかりません。
スタックのフラグメントを追加および削除するロジックには問題がないことがわかりました。
問題は、フラグメントの一部がその中に別のフラグメントをロードしたことでした(ViewPagerコンポーネントが含まれていました)。次に、フラグメントが削除されると、これらのフラグメントも削除されると思いました。
これは、getChildFragmentManager()
メソッドを使用する場合にのみ当てはまります。このメソッドは、他のフラグメント内にフラグメントをロードするときに使用する必要があります。そうでない場合、フラグメントはフラグメントアクティビティに関連付けられます。
私はこの質問を見つけました、なぜなら電話した後
_fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
_
このコードfragmentManager.getFragments().size()
は、スタックにあったフラグメントmeの最大数を返します。 nullのすべてのフラグメントをチェックしました。私の場合、一部のフラグメントがnullであることがわかりました。多分それは誰かを助けるでしょう)
popBackStack
は最後のFragmentTransaction
を元に戻します。
FragmentTransaction.add
を使用する場合、popBackStack
はFragmentTransacetion.remove
を呼び出すだけです。
ただし、FragmentTransaction.replace
を呼び出すと、popBackStack
はFragmentTransaction.remove
およびFragmentTransaction.add
を呼び出します
「注1」の場合:FragmentTransaction.replace
はフラグメントの状態を変更しません。
popBackStack()
がフラグメントを削除しないという同様の問題がありました。しかし、間違ったFragmentManager
を呼び出したことがわかりました。getSupportFragmentMananger()
ではなくgetFragmentManager()
を呼び出さなければなりませんでした。
本当に一度にフラグメントを削除したい場合は、以下に従ってください: 異なるタイプのフラグメントを置き換える方法?
それ以外の場合は、フラグメントの置換トランザクションを使用して、移行をスムーズにし、無料でアプローチできます。詳細は https://stackoverflow.com/a/23013075/31764 を参照してください
フラグメントのライフサイクルも理解してください http://developer.Android.com/guide/components/fragments.html