gpt4 book ai didi

android - 尽管调用了 onSaveInstance(),但在 onCreateView() 中 bundle savedInstanceState 始终为 null

转载 作者:行者123 更新时间:2023-11-29 15:58:34 26 4
gpt4 key购买 nike

我有 FragmentAActivityA 托管。当用户从选项菜单中选择一个项目时,将启动承载 FragmentBActivityB。现在,我想通过覆盖 onSaveInstanceState()FragmentA 中保留一个 String 和一个 boolean,所以当用户返回到 FragmentA,他们的信息被保留。

来自 FragmentA 的代码:

@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
//LOGS SHOW THAT THIS IS ALWAYS CALLED WITH CORRECT VALUES
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString("string", "example");
savedInstanceState.putBoolean("boolean", bool);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.fragmentA, parent, false);

//LOGS SHOW THAT THIS IS ALWAYS NULL
if (savedInstanceState != null)
{
if (savedInstanceState.getString("text") != null)
{
mObject.setText(savedInstanceState.getString("string"));
}

bool = savedInstanceState.getBoolean("boolean");
}

...
}

从阅读以前与我类似的问题:

1) 我决定将恢复信息的代码放在 onCreateView() 中,因为 onCreate() 不会总是被调用。 (虽然用onCreate()中的代码测试也有同样的问题。)

2) 我也没有调用 setRetainInstance(true),因为这会导致 Bundle savedInstanceState 始终为 null

3) 我确保 FragmentA 的 XML 布局有一个 id。此布局的各种子元素也有 ID。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragmentA"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">

...
</LinearLayout>

尽管如此,Bundle savedInstanceState 始终为 null。我在这里缺少什么?

感谢任何帮助。谢谢!

最佳答案

使用 onPause() 来保存您的持久数据,这是指您希望永久保留的数据,因此,您将其保存在您的 SharedPreferences 或你的数据库。另一方面,onSaveInstanceState 会重新训练数据,以防 Activity 被破坏并且您想取回该数据,一个好的场景是用户填写表格。你在你的例子中说你正在从 Activity A 导航到 Activity B,然后你回到 Activity A,当你第一次导航时, Activity A 没有被销毁,它只是被发送到后台,所以当你返回它时,它已经在那里并且会被带到前台,你的值实际上应该在那里没有改变,并且 onCreateonCreateView 将不会被调用,因为 Activity 仍然存在(尽管它可能会在设备内存不足的情况下被杀死)。

测试 onSaveInstanceState 的最佳和最快方法是最常用的场景,Orientation Change,方向更改将导致 Activity 完全销毁并重新创建,所以允许在 Activity A 上改变方向,在你的 saveStateBundle 中放置一些值并旋转设备,现在这将从一开始就调用你的所有方法,onCreate, onCreateView, ... 等以创建具有适当布局的 Activity ,您的 savedInstanceState 现在不应为 null。

请注意,这是假设您的应用程序保持 Activity 状态,如果您要完全关闭应用程序并仍想保留数据,请将您的信息放入 SharedPreferencesDatabase 并在您再次启动应用程序时检索它们。

//编辑 1

向您展示如何将值存储在应用程序中任何位置的 SharedPreferences 中,即使您的应用程序已关闭,这些值也是持久的。 (尽管 onSaveInstanceState 应该足以满足您的需求,但希望这会有所帮助)

// SharedPreference
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
// Storing
preferences.edit().putString("valueNameOrKey", StringValue).commit();
// Retrieving
preferences.getString("valueNameOrKey", defaultValueToReturnInCaseThatKeyIsNotFound);

//编辑2

要从 SharedPreferences 中删除任何键/值对,您可以这样做:

preferences.edit().remove("valueNameOrKey").commit();

但是请注意当您检索值时会发生什么,因为 key 将不可用,它将返回默认值,而不是像这样:

preferences.getString("valueNameoOrKey", ""); // "" Is my default value since I'm using a String

因为您可以使用 putString、putInt、putBoolean 等,get 函数也是如此,您的默认值必须与预期的返回类型匹配。

关于android - 尽管调用了 onSaveInstance(),但在 onCreateView() 中 bundle savedInstanceState 始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com