【问题标题】:Up navigation and saved instance data向上导航和保存的实例数据
【发布时间】:2014-01-11 01:52:58
【问题描述】:

一个应用有 2 个 Activity,A 和 B。

A 有保存的实例数据

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("foo", 0);
}

A 有

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

恢复数据。

活动 B 启用了操作栏,并且

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
    // ...
}

启用向上导航。在AndroidManifest.xml 中,A 也被列为 B 的父活动。

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

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

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

【问题讨论】:

  • 看起来这是一个重复的,在浏览了更多之后,我找到了this 答案,它清除了一切。
  • 我遇到了同样的问题。我在活动 A 中加载了一个 expandableListView 并将其传递给活动 B。当我使用 Android 后退按钮时,ExpandableListView 被保留,但是当我使用“向上”导航时,expandableListView 被破坏并且我有一个空活动。

标签: android android-activity android-actionbar


【解决方案1】:

我遇到了同样的问题 - 我只是想拥有两个活动 A 和 B,其中 A 是 B 的父级。当您在 B 中并单击向上按钮时,您返回到 A 并在 onCreate() 中恢复Bundle 中的数据。但是,捆绑包始终为 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);
}

这对我没有任何影响。我实际上不明白这段代码应该做什么。

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

据说:

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

当由于某些变化(如旋转)或因为它在后台暂停很长时间而重新创建 Activity 时使用 Bundle savedInstanceState。

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

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

【讨论】:

    【解决方案2】:

    正如@castafiore 所说,这取决于您的应用希望拥有什么行为。就我而言,我通过在AndroidManifest.xml 中添加android:launchMode="singleInstance" 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2015-01-01
      相关资源
      最近更新 更多