我正在学习如何使用碎片。我在类的顶部初始化了三个Fragment
实例。我像这样将碎片添加到活动中:
声明和初始化:
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
被重新启动,第二次按下“返回”按钮应该退出应用程序。但它显示一个空白窗口,我必须按第三次“返回”才能关闭它。
另外,当我启动A
,然后启动B
,然后启动C
,然后再次启动B
时......
预期结果:
| |
| |
|B|
|A|
___
实际的:
| |
|B|
|B|
|A|
___
我应该使用自定义覆盖onBackPressed()
还是我遗漏了什么?
OnBackstackChangedListener
。 - A--Cinstanceof
:) - A--C