android - fragment 数据丢失?状态丢失?

最佳答案

一些状态丢失的例子:

1. 假设您有一个按钮和一个 TextView 。在代码中,你已经定义了初始值为 0 的整数 i,它通过单击按钮递增 1,并且它的值显示在 TextView 中。假设你已经按下按钮 5 次,那么 textview 将被设置为 0。也就是说 Integer 在屏幕变化时丢失了它的值

解决方案:覆盖 onSaveInstanceState 并输入整数值。然后在 onResume 或 onCreate 方法中保留该整数的值。

2. 假设您有一个待办事项 ListView 。用户动态添加到该 ListView 中的dos。假设用户添加了 3 个项目,然后在屏幕旋转时(或者如果应用程序重新启动), ListView 将变为空。

解决方案: 再次在 onSaveInstanceState 中,放入 ArrayList。 (列表可以实现为“Serializabe”或“Parcelable”,并且可以作为一个整体存储。您不需要存储 ListView 的每个项目)。然后在 onResume 或 onCreate 方法中,获取该 ListView 。

3.屏幕旋转时,屏幕中的所有编辑文本都将变为空。

我对状态丢失的简单理解是,只要配置发生变化(屏幕旋转或应用重启), Activity 的整个生命周期都会被调用。因此,任何未保存的内容都将丢失。

好吧,这让我想起任天堂的退出屏幕消息,“任何未保存的内容都将丢失”。

android onSaveInstanceState

当Android应用程序的活动被系统销毁时,系统会调用onSaveInstanceState()方法来保存活动的当前状态。该方法获取一个Bundle对象作为参数,可以用来存储和传递数据。当活动被重新创建时,可以通过onRestoreInstanceState()方法来恢复之前保存的状态。

以下是一个示例代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // 在此处保存需要的状态数据到outState中
    outState.putString("key", "value");
}
 
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // 在此处恢复之前保存的状态数据
    String value = savedInstanceState.getString("key");
}