首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在添加到后台堆栈时维护片段状态?

如何在添加到后台堆栈时维护片段状态?
EN

Stack Overflow用户
提问于 2012-07-06 05:50:40
回答 15查看 157.7K关注 0票数 168

我已经编写了一个在两个片段之间切换的虚拟活动。当您从FragmentA转到FragmentB时,FragmentA将被添加到后端堆栈。然而,当我返回到FragmentA (通过按back)时,一个全新的FragmentA被创建了,它所处的状态也丢失了。我感觉我在追求和this问题一样的东西,但我已经包含了一个完整的代码样本来帮助根治这个问题:

代码语言:javascript
复制
public class FooActivity extends Activity {
  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(android.R.id.content, new FragmentA());
    transaction.commit();
  }

  public void nextFragment() {
    final FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(android.R.id.content, new FragmentB());
    transaction.addToBackStack(null);
    transaction.commit();
  }

  public static class FragmentA extends Fragment {
    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
      final View main = inflater.inflate(R.layout.main, container, false);
      main.findViewById(R.id.next_fragment_button).setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
          ((FooActivity) getActivity()).nextFragment();
        }
      });
      return main;
    }

    @Override public void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      // Save some state!
    }
  }

  public static class FragmentB extends Fragment {
    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
      return inflater.inflate(R.layout.b, container, false);
    }
  }
}

添加了一些日志消息:

代码语言:javascript
复制
07-05 14:28:59.722 D/OMG     ( 1260): FooActivity.onCreate
07-05 14:28:59.742 D/OMG     ( 1260): FragmentA.onCreateView
07-05 14:28:59.742 D/OMG     ( 1260): FooActivity.onResume
<Tap Button on FragmentA>
07-05 14:29:12.842 D/OMG     ( 1260): FooActivity.nextFragment
07-05 14:29:12.852 D/OMG     ( 1260): FragmentB.onCreateView
<Tap 'Back'>
07-05 14:29:16.792 D/OMG     ( 1260): FragmentA.onCreateView

它永远不会调用FragmentA.onSaveInstanceState,当你回击时,它会创建一个新的FragmentA。但是,如果我在FragmentA上锁定了屏幕,就会调用FragmentA.onSaveInstanceState。所以weird...am我错误地期望添加到后台堆栈的片段不需要重新创建?以下是docs的说法:

然而,如果在删除片段时调用addToBackStack(),则该片段将停止,并在用户返回时恢复。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11353075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档