@trueblueの回答により、マイナーだが厄介な問題が1つ発生しました。バックスタックにフラグメントが 1 つしかないときに [戻る] ボタンを押すと、そのフレームが削除され、アプリは空白の画面でアクティブなままになります。アプリを終了するには、ユーザーが戻るボタンをもう一度押す必要がありました。この状況を処理するために、元のコードを次のように変更しました
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
}
else if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
getFragmentManager().popBackStack();
}
}
バックスタックにフラグメントが 1 つしかない場合、基本的にはアプリ全体を後ろに移動するように Android に指示しています。
更新(そしておそらくより良い答え)
したがって、これについてさらに読んだ後、フラグメントマネージャートランザクションをバックスタックに追加すると、Android がバックプレスを自動的かつ望ましい方法で処理できることがわかりました。以下のコード スニペットは、その方法を示しています。
Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);
最後の行は、トランザクションをバック スタックに追加する方法を示しています。これにより、1 つを除いてほとんどの状況でフラグメントのバック プレスの問題が解決されます。戻るボタンを押し続けると、最終的にバック スタックにフラグメントが 1 つだけになるポイントに到達します。この時点で、次の 2 つのいずれかを実行する必要があります。
- アクティビティが実行されているタスクのバック スタックから、フラグメントを格納しているアクティビティを削除します。これは、空白のアクティビティで終わりたくないためです。
- アクティビティがタスクのバック スタック内の唯一のアクティビティである場合は、バックグラウンドでタスクをプッシュします。
私の場合は後者だったのでonBackPressed
、以前の回答からオーバーライドされたメソッドを次のように変更しました
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
super.onBackPressed();
}
}
このコードは、ロジックが少なく、カスタム コードよりもフレームワークに依存しているため、より単純です。残念ながら、必要がなかったため、最初の状況ではコードを実装できませんでした。