フラグメントの使い方を学んでいます。Fragment
クラスの先頭で初期化されているインスタンスが3つあります。このようなアクティビティにフラグメントを追加しています:
宣言と初期化:
Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
交換/追加:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
これらのスニペットは正しく機能しています。すべてのフラグメントはアクティビティに添付され、問題なくバックスタックに保存されます。
したがって、を起動するA
とC
、B
スタックは次のようになります。
| |
|B|
|C|
|A|
___
そして「戻る」ボタンを押すと、B
破壊されC
て再開されます。
しかし、フラグメントをもう一度起動A
すると、バックスタックから再開するのではなく、フラグメントがバックスタックの一番上に追加されます
| |
|A|
|C|
|A|
___
しかしA
、その上にあるすべてのフラグメント(ある場合)を再開して破棄したいと思います。実際、私はデフォルトのバックスタック動作が好きです。
どうすればこれを達成できますか?
予想:(A
再開し、上部のフラグメントを破棄する必要があります)
| |
| |
| |
|A|
___
編集:(A--Cが推奨)
これは私の試行コードです:
private void selectItem(int position) {
Fragment problemSearch = null, problemStatistics = null;
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
String backStateName = null;
Fragment fragmentName = null;
boolean fragmentPopped = false;
switch (position) {
case 0:
fragmentName = profile;
break;
case 1:
fragmentName = submissionStatistics;
break;
case 2:
fragmentName = solvedProblemLevel;
break;
case 3:
fragmentName = latestSubmissions;
break;
case 4:
fragmentName = CPExercise;
break;
case 5:
Bundle bundle = new Bundle();
bundle.putInt("problem_no", problemNo);
problemSearch = new ProblemWebView();
problemSearch.setArguments(bundle);
fragmentName = problemSearch;
break;
case 6:
fragmentName = rankList;
break;
case 7:
fragmentName = liveSubmissions;
break;
case 8:
Bundle bundles = new Bundle();
bundles.putInt("problem_no", problemNo);
problemStatistics = new ProblemStatistics();
problemStatistics.setArguments(bundles);
fragmentName = problemStatistics;
default:
break;
}
backStateName = fragmentName.getClass().getName();
fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
ft.replace(R.id.content_frame, fragmentName);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(backStateName);
ft.commit();
// I am using drawer layout
mDrawerList.setItemChecked(position, true);
setTitle(title[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
問題は、起動してA
からB
「戻る」を押すB
と、削除されてA
再開されることです。もう一度「戻る」を押すと、アプリが終了します。しかし、それは空白のウィンドウを表示しており、私はそれを閉じるために3回押し戻す必要があります。
また、を起動するとA
、次にB
、次にC
、そしてB
再び...
期待される:
| |
| |
|B|
|A|
___
実際:
| |
|B|
|B|
|A|
___
onBackPressed()
カスタマイズでオーバーライドする必要がありますか、それとも何か不足していますか?