我写了一个虚拟活动,在两个片段之间切换.从FragmentA转到FragmentB时,FragmentA会添加到后堆栈中.然而,当我返回FragmentA(通过按back)时,一个全新的FragmentA被创建,它所处的状态消失了.我觉得我想要的东西和this个问题一样,但我提供了一个完整的代码示例来帮助解决这个问题:

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);
    }
  }
}

添加了一些日志(log)消息后:

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.太奇怪了……我期望添加到后台堆栈的片段不需要重新创建,这是不是错了?以下是这docs人的评价:

然而,如果在删除片段时调用addToBackStack(),

推荐答案

如果从后台堆栈返回到某个片段,则不会重新创建该片段,而是重新使用同一实例,并且在片段生命周期中从onCreateView()开始,请参见Fragment lifecycle.

所以,如果你想存储状态,你应该使用实例变量,not依赖于onSaveInstanceState().

Android相关问答推荐

Jetpack编写:通过viewModels()vs viewModel View ModernName()'

Jetpack编写使用自定义主题覆盖库中主题部分

如何使用Jetpack Compose实现此底表?

默认调度程序是否在协程中使用共享线程池?

在Jetpack Compose中,如何判断屏幕是否已重新组合?

Modifer.Align()不适用于行/列/框中的文本.未解决的作用域实例错误

在Android中使用Room从SQlite数据库中获取实体列表的正确方式是什么?

在 Bash 脚本中使用 XMLLINT 解析 XML 单元测试文件,并将其放入数组中以表示成功和失败

使用 Jetpack Compose 在 Android TV 上启用系统声音

为什么@PrimaryKey val id: Int? = null 在创建 Room 实体时有效吗?

Jetpack Compose with Paging 3 发出太多网络请求

如何添加到先前预填充的 Room 数据库?

是否可以在 Kotlin 中为 mutableStateOf() 设置自定义设置器

android xml底部空间大

react 从输入中找到路径'lib/arm64-v8a/libfbjni.so'的本机2个文件

您如何衡量条形图的 4 个类别?

java.lang.IllegalArgumentException:与请求匹配的导航目的地 NavDeepLinkRequest

如何处理 com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "T1V 4Y8" Kotlin

Unity:Android 上随机接近零的 FPS 下降(提供了很多线索)

如何使用 Kotlin Coroutines 正确地拥有待处理的操作队列?