当前位置: 首页 > 知识库问答 >
问题:

在替换片段中进行双重旋转后恢复片段时,请清空savedInstanceState束

荆亦
2023-03-14

让我们称它们为片段A和B。片段B只是A的一个详细视图,它在点击片段A中的按钮时替换了片段A。

更换代码:

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, new DetailFragment());
    transaction.addToBackStack(null);
    transaction.commit();

当我现在旋转片段B中的屏幕一次并按下后,旧片段A会毫无问题地恢复(它在由savedInstanceState包创建的OnActivityCreate中恢复其状态)。

现在到了有趣的部分...

当我在片段B中多次旋转屏幕并按下Back键时,我得到一个NullPointerException,因为int[]data=savedInstanceState。getIntArray(STATE_数据) 返回null。

我如何修复这种行为?我想到的唯一其他方法是通过永久存储(首选项或数据库),但这似乎非常不适合用例。

编辑/附加信息:包本身不是空的,它只是空的

共有1个答案

扈沛
2023-03-14

好吧我找到答案了:

当片段B处于活动状态时,在旋转时调用片段A中的以下方法:onSaveInstanceState()、onAttach()和onCreate()

因为我正在onActivityCreated中恢复我的状态(这实际上是sdk推荐的!)在第一次旋转后,我丢失了存储在bundle中的变量,因为它们从未加载到局部变量中,这些局部变量将存储在下一个onSaveInstanceState中。因此,当我在第二次旋转后尝试检索这些值时,这些值为null。

解决方案:恢复onCreate()中的变量,使其在再次调用onSaveInstanceState时可用。

 类似资料:
  • 我有一个片段,在这里我调用自定义视图类(Dragger) 并且我有另一个片段与和适配器,在其中我调用方法通过主机的活动的。 我发现在中旋转后会获得新的引用,但当我从适配器调用时-为空。 我真的不明白为什么字段得到引用,然后又丢失了它) 有人知道这有什么不对吗? 提前谢谢! P. S.:主机活动

  • 在需要动态添加和从viewpager中删除列表片段的应用程序中工作,当点击列表中的一个项目时,新的片段会添加到viewpager中,当需要删除swipe back片段时,这工作效果很好,但当我旋转屏幕时,页面中的片段会有两个实例,再旋转一次,实例会增加四倍。 同时,我需要持久化片段的状态(列表位置、加载的项数等),这意味着重写片段中的onsaveinstancestate并将相关数据保存在捆绑包中

  • 我的Android应用程序有问题,我正在使用Android StudioIDE进行开发。差不多是当我把应用程序放在后台几分钟,或者被系统杀死,或者我混合了片段的不同布局时。我在下面放了一张图片: 如果你有其他人也写的话,我已经尝试了各种方法。提前谢谢你。

  • 在我的应用程序中,当点击导航抽屉上的不同项目时,我需要在片段之间切换。我为它创建了一个新方法DisplayFragment。代码如下: 它显示了错误的"片段元素在上面的行如下"错误的第二个参数类型找到android.support.v4.app.片段;需要android.app.片段;" 我试着改变从android的导入。支持v4.app。碎片到android。应用程序。碎片但它随后显示了Frag

  • 可以使用保存删除片段时的状态,然后在将片段弹出后堆栈时恢复状态吗?当我从后堆栈还原片段时,savedInstanceState包始终为空。 现在,应用程序流程是:创建的片段->删除的片段(添加到后堆栈)->从后堆栈恢复的片段(savedInstanceState包为空)。 下面是相关代码: 我认为问题是在被移除和添加到后堆栈时从未被调用。如果我不能使用onsavedInstanceState(),

  • 我试图在列表视图的onItemClick中用另一个片段替换片段,我想将所选项目名称从列表片段发送到另一个片段,但它显示空指针异常 @覆盖onItemClick上的公共无效(AdapterView ar0,视图,int位置,长id){ 但是同样的概念在下面的按钮点击中工作