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变量保存在其中。
| 归档时间: |
|
| 查看次数: |
3104 次 |
| 最近记录: |