Android - 如果存在,如何从后台堆栈中恢复片段?

时间:2014-02-18 10:59:06

标签: android fragment slidingmenu back-stack

您好我正在处理带有片段的滑动菜单。 Indivisual片段正常工作。但假设用户导航从片段A-> B,现在'B'工作正常,现在如果用户从B-> A开始,则片段'A'从onAttach()调用。

如果打开任何片段,我想要这样的条件,而不是重新打开它不应该加载整个片段,它应该像我们处理Intent.FLAG_ACTIVITY_REORDER_TO_FRONT的活动一样恢复。

这是我的代码......

FragmentManager fm = MainActivity.this.getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction();  
Layout1 fragment = new Layout1();  
ft.add(R.id.activity_main_content_fragment, fragment,Layout1.class.getName());
ft.addToBackStack(Layout1.class.getName());
ft.commit();

1 个答案:

答案 0 :(得分:1)

回答更新:

阅读文档,有一种方法可以根据事务名称或commit提供的id弹出后台堆栈。使用名称可能更容易,因为它不需要跟踪可能改变的数字并加强“唯一的后栈条目”逻辑。

由于每个Fragment只需要一个后向堆栈条目,因此将后面的状态名称设为Fragment的类名(通过getClass()。getName())。然后在替换Fragment时,使用popBackStackImmediate()方法。如果返回true,则表示后端堆栈中存在Fragment的实例。如果没有,实际执行Fragment替换逻辑。

private void replaceFragment (Fragment fragment){
  String backStateName = fragment.getClass().getName();

  FragmentManager manager = getSupportFragmentManager();
  boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);

  if (!fragmentPopped){ //fragment not in back stack, create it.
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.content_frame, fragment);
    ft.addToBackStack(backStateName);
    ft.commit();
  }
}

如果从后向堆栈返回一个片段,它不会重新创建片段,而是重新使用相同的实例,并以onCreateView()中的fragment lifecycle开头,请参阅片段生命周期。

因此,如果您想存储状态,则应使用实例变量,而不是依赖onSaveInstanceState()

检查此链接。它会有助How to resume Fragment from BackStack if exists