gpt4 book ai didi

android - savedInstanceState 始终为空

转载 作者:IT老高 更新时间:2023-10-28 13:16:43 25 4
gpt4 key购买 nike

这是我保存的InstaceState 代码:

@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);
}

日志总是显示“bundle 保存”标签。

但是在onCreate方法中,SavedInstanceState总是为null。

最佳答案

我在一个项目中观察到完全相同的症状(报告为 issue 133394),该项目具有两个扩展 ActionBarActivity 的 Activity AB。 Activity A 是主要 Activity ,返回时我总是在其列表 fragment 的 onCreate 中收到 null for savedInstanceState从详细 View Activity B。几个小时后,我发现这个问题是伪装的导航问题。

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

  • 给定 this回答,我确保 fragment 和 Activity 都设置了唯一的 ID。
  • 没有 super 调用不会覆盖 onSaveInstanceState
  • Activity AAndroidManifest.xml 中被指定为 Activity B 的父级,同时使用 android:parentActivityName 属性和对应的 meta-data 标记(参见“Providing Up Navigation”)。

已经没有任何相应的创建代码如getActionBar() .setHomeButtonEnabled(true),activity B有一个正常工作的返回按钮(< strong><) 在其操作栏中。当点击此按钮时, Activity A 会重新出现,但 (a) 之前的所有实例状态都会丢失,(b) onCreate 总是被调用,并且 (c) savedInstanceState 总是 null.

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

more reading 之后,我实现了自己的导航指令以响应在 Activity B 中点击后退按钮运行:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home)
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}

与恢复 Activity A 的实例状态相关的任何内容均未更改。 NavUtils 还提供了一个方法 getParentActivityIntent(Activity)navigateUpTo(Activity, Intent) 允许我们修改导航 Intent 以明确指示该 Activity A 不会通过设置 FLAG_ACTIVITY_CLEAR_TOP 标志重新开始(因此没有提供保存的实例状态):

If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.

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

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);
}

请注意,在用户可以从不同任务中直接切换到 Activity B 的其他情况下,这可能不是完整的解决方案(请参阅 here )。此外,不使用 NavUtils 的行为可能相同的解决方案是简单地调用 finish():

public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()== android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}

两种解决方案都在我手中。我只是推测原始问题是后退按钮的默认实现稍有不正确,它可能与调用某种 navigateUp 的实现有关,该实现错过了 FLAG_ACTIVITY_CLEAR_TOP .

关于android - savedInstanceState 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6554317/

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