如果存在,如何从后台恢复片段我正在学习如何使用片段。我有三个例子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; }问题是,当我启动A然后B然后按“后退”键,B被移除A已经恢复了。第二次按“后退”键就可以退出应用程序了。但是它显示的是一个空白窗口,我不得不第三次按下才能关闭它。同时,当我发射A,然后B,然后C,然后B再一次.。预期:| || ||B||A|___实际:| ||B||B||A|___我应该覆盖onBackPressed()有什么可定制的还是我漏掉了什么?
3 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
步骤1:
public class AuthenticatedMainActivity extends Activity implements FragmentManager.OnBackStackChangedListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
.............
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().add(R.id.frame_container,fragment, "First").addToBackStack(null).commit();
}
private void switchFragment(Fragment fragment){
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).addToBackStack("Tag").commit();
}
@Override
public void onBackStackChanged() {
FragmentManager fragmentManager = getFragmentManager();
System.out.println("@Class: SummaryUser : onBackStackChanged "
+ fragmentManager.getBackStackEntryCount());
int count = fragmentManager.getBackStackEntryCount();
// when a fragment come from another the status will be zero
if(count == 0){
System.out.println("again loading user data");
// reload the page if user saved the profile data
if(!objPublicDelegate.checkNetworkStatus()){
objPublicDelegate.showAlertDialog("Warning"
, "Please check your internet connection");
}else {
objLoadingDialog.show("Refreshing data...");
mNetworkMaster.runUserSummaryAsync();
}
// IMPORTANT: remove the current fragment from stack to avoid new instance
fragmentManager.removeOnBackStackChangedListener(this);
}// end if
} }步骤2:
String backStateName = this.getClass().getName();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.addOnBackStackChangedListener(this);
Fragment fragmentGraph = new GraphFragment();
Bundle bundle = new Bundle();
bundle.putString("graphTag", view.getTag().toString());
fragmentGraph.setArguments(bundle);
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragmentGraph)
.addToBackStack(backStateName)
.commit();
- 3 回答
- 0 关注
- 416 浏览
添加回答
举报
0/150
提交
取消
