如果存在,如何从后台恢复片段我正在学习如何使用片段。我有三个例子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 回答
![?](http://img1.sycdn.imooc.com/545865470001bf9402200220-100-100.jpg)
慕沐林林
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 关注
- 353 浏览
添加回答
举报
0/150
提交
取消