向上导航和保存的实例数据

GDa*_*ger 8 android android-activity android-actionbar

一个应用程序有2个活动,A和B.

A具有保存的实例数据

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("foo", 0);
}
Run Code Online (Sandbox Code Playgroud)

和A有

int bar;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    if (savedInstanceState != null) {
        bar = savedInstanceState.getInt("foo");
    } else {
        bar = -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

恢复数据.

活动B启用了操作栏

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

启用导航.A也被列为B的父活动AndroidManifest.xml.

当用户从A导航到B时onSaveInstanceState,如果他们导航回A使用后退按钮活动,则A正确恢复其保存的信息.

但是,当用户从A导航到B时onSaveInstanceState,然后使用向上导航返回到A,即使保存了信息,onCreate(Bundle savedInstanceState)也会传递null.

如何启动导航以传递创建的Bundle onSaveInstanceState

小智 4

我遇到了同样的问题 - 我只是想要两个活动 A 和 B,其中 A 是 B 的父级。当您在 B 中并单击“向上”按钮时,您将返回到 A 并onCreate()从捆绑包中恢复数据。然而,捆绑始终是null

在大多数情况下,人们建议android:launchMode="singleTop"在清单中设置活动。实际上,这不一定是所需的行为,因为它仅意味着当您单击“向上”按钮时,不会重新创建父级。您可能会发现这没问题,但就我而言,我绝对希望重新创建父级以反映数据库中的某些更改。

其他解决方案表示将侦听器附加到向上按钮并添加以下代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent intent = NavUtils.getParentActivityIntent(this);
            intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            NavUtils.navigateUpFromSameTask(this);
            break;
    }

    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

这对我来说没有效果。我实际上不明白这段代码应该做什么。

不过,我想我在另一篇文章中找到了这个问题的答案。在这里检查一下。

据说:

当您按回键时,活动将被销毁,并且其所拥有的数据将丢失。此后,当您重新打开应用程序时,将始终在捆绑包中获得 null,因为正在创建一个新的、全新的实例。

当由于某些更改(如旋转)或在后台暂停很长时间而重新创建 Activity 时,将使用 Bundle savingInstanceState。

如果您想保留一些数据,请考虑使用 SharedPreferences 来保存小数据,或者考虑使用数据库(SQLite、Realm)或文件来保存大数据。

我想捆绑的方法根本不是 Android 希望我们这样做的方式。您应该使用一个SharedPreferences对象并将foo变量保存在其中。