popBackStack
スタックを制御するために、フラグメントを変更するときと適切なタイミングで賢くする必要があります。これは私のアプリケーションの 1 つの例です (スタック内の既存のフラグメントの再利用も処理します)。
// Idea from http://stackoverflow.com/questions/18305945/how-to-resume-fragment-from-backstack-if-exists
private void setPrimaryContentFragment(BaseFragment fragment, boolean allowStack){
final String backStackName = fragment.getBackStackName();
final FragmentManager manager = getSupportFragmentManager();
final boolean fragmentPopped = manager.popBackStackImmediate(backStackName, 0);
if (!fragmentPopped) { //fragment not in back stack, create it.
if (!allowStack && manager.getBackStackEntryCount() > 1) {
manager.popBackStack(manager.getBackStackEntryAt(0).getId(), 0);
}
final FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.primary_content, fragment);
transaction.addToBackStack(backStackName);
transaction.commit();
try {
manager.executePendingTransactions();
} catch (IllegalStateException exception) {
// Move along as this will be resolved async
}
}
}
メソッドは私のgetBackStack()
基本フラグメントに実装されており、デフォルトの実装は次のとおりです。
public String getBackStackName() {
return getClass().getName();
}
フラグは、allowStack
バックスタックに複数のエントリが存在できるかどうかを制御するために使用されます。
ユーザーが詳細ページに直接移動したときに製品フラグメントを挿入する限り、おそらくそれを行う必要があります。例: 製品の置換を実行してから、製品の詳細の置換を実行します。このコード スニペットとリンクされた投稿が、必要なソリューションを考え出すのに役立つことを願っています。