有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 安卓还原处于backstack中的片段的实例状态

嗨,我有一个活动有两个片段

  1. 片段A
  2. 片段B

    • 片段A有一个EditText和一个ListView
    • 在EditText中输入内容并点击enter键后,我将填充ListView
    • 现在片段A的ListView中填充了数据
    • 单击片段A的列表视图上的任何项目都会将用户发送到片段B
    • 此时,我将用片段B替换片段A
    • 因此,当用户点击后退按钮时,他返回到片段A

现在的问题是,如果用户在片段B中,并且配置更改多次发生,如屏幕旋转等,那么我的列表视图是空的,因为我的arraylist是空的

注意,我在片段A和片段B中使用onSavedInstanceState。 如果我当前的片段是片段A,并且发生了配置更改,那么恢复状态就没有问题,因为在onCreateView中,我从bundle获取arraylist

当我从片段B返回到之前处于backback中的片段A时,我知道为什么我的arraylist为null。当片段A处于backstack时,唯一被调用的方法是onSaveInstanceState,因此在第一次配置更改后,我的arraylist字段为null,因为我无法将存储在SavedInstanceState捆绑包中的arraylist分配给arraylist字段

我不想在清单中使用安卓:configchanges属性

我的问题是如何恢复处于backback状态的片段的状态


共 (3) 个答案

  1. # 1 楼答案

    您可以在onAttach中使用setRetaininstance(true)和这一行 ConfigChanges = "screenSize|keyBoardHidden|orientation"在活动清单文件中

  2. # 2 楼答案

    我通过在添加到backstack之前将片段的所有细节传递给主活动,并以主活动的savedInstance状态保存该状态,实现了保留backstack中片段的状态的目标,并且每当backstack发生变化且之前的片段可见时,我都会传递该片段的已保存实例状态从主要活动中分离出来,这样我就保留了状态。我不确定这是否是正确的方法

  3. # 3 楼答案

    我已经看过你的剧本了。 当你在片段的savedinstanceState中添加arraylist时,基本上你做的是正确的,但根据我的说法,你在你的活动中没有犯什么错误

    当方向发生变化时,调用onDestroy,然后在该场景中再次创建,如果您没有检查片段是否已添加,那么它将用新片段替换它。 以下是您应该输入onCreate()的代码

     FragmentManager fragmentManager = getFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag("FragmentA");
        if(fragment==null){
            fragmentManager.beginTransaction().add(R.id.container, new FrgamentA(), "FragmentA").commit();
        }
    

    另一点是,当您希望保留第一个片段时

    setRetainInstance(true);
    

    在片段的一次创造中

    请在GitHub上找到此演示 inpulse-fragment

    在这个演示中,当你增加计数器时,它会出现在上面的文本视图中,如果你点击该文本视图,你将导航到片段B。现在你可以尝试旋转。 如果有任何疑问,请告诉我