savedInstanceState始终为null

时间:2011-07-02 00:17:13

标签: android

这是我的savedInstaceState代码:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) 
{
    savedInstanceState.putStringArrayList("todo_arraylist", Altodo);
    Log.v("bundle", "Saved");
    super.onSaveInstanceState(savedInstanceState);
}


public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) 
    {
        Altodo = savedInstanceState.getStringArrayList("todo_arraylist");
        Log.v("bundle", "Restored");
    }
    else
    {
        Log.v("bundle", "null");
    }

    setContentView(R.layout.main);
}

日志始终显示“捆绑保存”标记。

但在onCreate方法中,SavedInstanceState始终为空。

13 个答案:

答案 0 :(得分:48)

我在项目中观察到完全相同的症状(报告为issue 133394),其中两个活动 A B 延伸ActionBarActivity。活动 A 是主要活动,当从详细信息视图活动 B返回时,我的列表片段的null中的savedInstanceState始终会收到onCreate 即可。经过几个小时,这个问题暴露给我作为伪装的导航问题。

以下内容可能与我的设置有关,并且来自此页面上的其他答案:

  • 鉴于this回答,我确保片段和活动都设置了唯一的ID。
  • 如果没有onSaveInstanceState来电,则无法覆盖super
  • 活动 A AndroidManifest.xml中被指定为acitivy B 的父级,同时使用android:parentActivityName属性和相应的{早期版本Android的{1}}标记(请参阅" Providing Up Navigation")。

已经没有任何相应的创建代码,例如meta-data getActionBar(),活动 B 在其操作中有一个正常运行的后退按钮(< )酒吧。点按此按钮后,活动 A 重新出现,但(a)所有先前的实例状态丢失,(b) .setHomeButtonEnabled(true)被叫,(c) onCreate总是savedInstanceState

有趣的是,当我点击模拟器显示屏底部边缘提供的后退按钮(一个指向左侧的空心三角形)时,活动 A 会再次出现(就像它的实例一样)状态完全保留)而不调用null。那么导航可能有问题吗?

more reading之后,我实施了自己的导航说明,以便在活动 B 中点按后退按钮时运行:

onCreate

与恢复实例活动状态 A 无关。 @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 还提供了一种方法NavUtilsgetParentActivityIntent(Activity),允许我们修改导航意图,以明确指示活动 A 未重新开始(因此未保存)实例状态提供)通过设置navigateUpTo(Activity, Intent)标志:

  

如果设置,则正在启动的活动已在运行中   当前任务,然后而不是启动它的新实例   活动,其上的所有其他活动将被关闭   这个意图将作为一个传递到(现在在顶部)旧活动   新的意图。

在我手中,这解决了实例状态丢失的问题,可能看起来像:

FLAG_ACTIVITY_CLEAR_TOP

请注意,在其他用户可以从其他任务中直接切换到活动 B 的情况下,这可能不是完整的解决方案(请参阅here)。此外,不使用public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId()== android.R.id.home) { Intent intent = NavUtils.getParentActivityIntent(this); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, intent); return true; } return super.onOptionsItemSelected(item); } 的可能相同的行为解决方案是简单地调用NavUtils

finish()

这两种解决方案都在我手中。我只是推测原始问题是后退按钮的稍微不正确的默认实现,它可能与调用某种public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId()== android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } 错过navigateUp的实现有关。

答案 1 :(得分:14)

您是否检查过是否为该视图设置了Id(如果视图是/有......)。否则不会调用onSaveInstanceState()。

选中link

答案 2 :(得分:13)

以这种方式保存的状态不会持续存在。如果整个应用程序在调试过程中被杀死,则在onCreate中该包将始终为空。

这个IMO是另一个糟糕的Android文档的例子。这也是为什么市场上的大多数应用程序都没有正确实现保存状态(根本)。

答案 3 :(得分:7)

在清单中

为活动添加此行

android:launchMode="singleTop"

例如:

<activity
        android:name=".ActivityUniversity"
        android:label="@string/university"
        android:launchMode="singleTop"
        android:parentActivityName="com.alkhorazmiy.dtm.ActivityChart">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.alkhorazmiy.dtm.ActivityChart" />
    </activity>

答案 4 :(得分:3)

你如何测试它?

Imo测试它的最佳方法是在设置&gt;中使用“不要保持活动” - 标志。开发者选项。如果您在“设置”中没有“开发者选项”,请参阅Enabling On-device Developer Options

  1. 打开您的活动
  2. 长按回家
  3. 转到其他应用程序
  4. 长按回家
  5. 返回您的应用程序

答案 5 :(得分:3)

不应该super.onSaveInstanceState(savedInstanceState);成为覆盖的第一行吗?

修改:War_Hero在评论中指出documentation on that topic表示不,它不应该是第一行。

答案 6 :(得分:1)

检查select t.* from table t order by (case when surname = 'Z' then 1 else 2 end), id desc limit 1; 中的活动,如果属实,则删除AndroidManifest.xml属性。

android:noHistory

答案 7 :(得分:0)

要进行调试,请考虑在此方法中实现onRestoreInstanceState并调用Log.d。然后,在模拟器中,按ctrl-F11或其他任何旋转手机。您应该点击您对Log.d的调用。

答案 8 :(得分:0)

实施onRestoreInstanceState的方法 并将代码放在下面

Altodo = savedInstanceState.getStringArrayList("todo_arraylist");

答案 9 :(得分:0)

我发现当我覆盖onSaveInstanceState()并实际在Bundle中保存一些数据时,将恢复实例状态。否则就不是。

答案 10 :(得分:0)

我已经用同样的方法来处理。我没有在onCreateView方法上处理saveInstanceState Bundle,而是在onCreate方法上对其进行处理,并将传递的值设置为globar变量,然后在onCreateView方法上访问此变量。 希望对您有所帮助。

答案 11 :(得分:0)

this question

从中您可以看到“类似地,如果您导航到当前堆栈上的活动,则该行为由父活动的启动模式确定。”也许您处于“标准”模式。

答案 12 :(得分:0)

我能够通过以下方式解决它:

@Override public boolean onSupportNavigateUp()
{
    onBackPressed();
    return true;
}

清单中仍然设置了父级。因此,当您按下向上导航按钮时,现在它的作用类似于后退按钮。