这是我的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);
}
Run Code Online (Sandbox Code Playgroud)
日志始终显示"捆绑保存"标记.
但在onCreate方法中,SavedInstanceState始终为null.
s.b*_*ara 50
我在一个项目中观察到完全相同的症状(报告为问题133394),其中有两个活动A和B延伸ActionBarActivity.活性甲是主要的活性,我总是接收null用于savedInstanceState在onCreate其列表片段从一个详细视图活动返回时乙.经过几个小时,这个问题暴露给我作为伪装的导航问题.
以下内容可能与我的设置有关,并且来自此页面上的其他答案:
onSaveInstanceState没有super电话就没有覆盖.AndroidManifest.xml,使用Android的早期版本的android:parentActivityName属性和相应meta-data标签(请参阅" 提供导航 ").已经没有任何相应的创建代码,例如getActionBar() .setHomeButtonEnabled(true),活动B在其操作栏中有一个功能后退按钮(<).当点击此按钮时,活动A重新出现,但(a)所有先前的实例状态丢失,(b) onCreate始终被调用,(c) savedInstanceState始终null.
有趣的是,当我点击模拟器显示器底部边缘提供的后退按钮(一个指向左侧的空心三角形)时,活动A会在不调用的情况下重新出现(即实例状态完全保留)onCreate.那么导航可能有问题吗?
经过更多阅读后,我实施了自己的导航说明,以响应活动B中后退按钮的点击:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home)
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
与恢复实例活动状态A无关的任何内容都已更改.NavUtils还提供了一个方法getParentActivityIntent(Activity),并navigateUpTo(Activity, Intent)允许我们修改导航意图明确指示该活动的一个通过设置(不提供保存实例状态,因而)不启动新的FLAG_ACTIVITY_CLEAR_TOP标志:
如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为新的意图.
在我手中,这解决了丢失实例状态的问题,可能看起来像:
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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,在用户可以从不同任务中直接切换到活动B的其他情况下,这可能不是完整的解决方案(请参阅此处).此外,一个可能不相同的行为解决方案NavUtils是简单地调用finish():
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()== android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
这两种解决方案都在我手中.我只是推测原始问题是一个稍微不正确的后退按钮的默认实现,它可能与调用某种navigateUp错过的实现有关FLAG_ACTIVITY_CLEAR_TOP.
mxc*_*xcl 13
以这种方式保存的国家不会持久存在.如果在调试期间整个应用程序被杀死,则bundle将始终为null onCreate.
这个IMO是糟糕的Android文档的另一个例子.这也是为什么市场上的大多数应用程序都没有正确实现保存状态(根本).
小智 7
在Manifest中为活动添加此行
android:launchMode="singleTop"
Run Code Online (Sandbox Code Playgroud)
例如:
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53839 次 |
| 最近记录: |