所以我有一个活动 A 和一个活动 B。我希望活动 A 能够通过按下按钮导航到活动 B。这行得通,但是当我使用向上导航(操作栏中的主页按钮)导航回活动 A 时,再次调用 onCreate() 并且用户输入的旧信息丢失了。
我已经看到:onCreate 总是在以 intent 导航返回时调用,但他们使用了 Fragments,我希望不必重新设计整个应用程序来使用 Fragment。每次活动 A 再次激活时,有什么方法可以阻止 onCreate() 被调用?
所以我有一个活动 A 和一个活动 B。我希望活动 A 能够通过按下按钮导航到活动 B。这行得通,但是当我使用向上导航(操作栏中的主页按钮)导航回活动 A 时,再次调用 onCreate() 并且用户输入的旧信息丢失了。
我已经看到:onCreate 总是在以 intent 导航返回时调用,但他们使用了 Fragments,我希望不必重新设计整个应用程序来使用 Fragment。每次活动 A 再次激活时,有什么方法可以阻止 onCreate() 被调用?
这种行为是完全正常的,也是想要的。系统可能决定停止Activities
在后台释放一些内存。旋转设备时也会发生同样的事情。
通常,您将实例状态(如输入的文本和内容)保存到包中,并在Activity
重新创建包时从包中获取这些值。
这是我使用的一些标准代码:
private EditText mSomeUserInput;
private int mSomeExampleField;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO inflate layout and stuff
mSomeUserInput = (EditText) findViewById(R.id.some_view_id);
if (savedInstanceState == null) {
// TODO instanciate default values
mSomeExampleField = 42;
} else {
// TODO read instance state from savedInstanceState
// and set values to views and private fields
mSomeUserInput.setText(savedInstanceState.getString("mSomeUserInput"));
mSomeExampleField = savedInstanceState.getInt("mSomeExampleField");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// TODO save your instance to outState
outState.putString("mSomeUserInput", mSomeUserInput.getText().toString());
outState.putInt("mSomeExampleField", mSomeExampleField);
}
您可以通过覆盖使向上按钮的行为类似于按回onSupportNavigateUp()
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
如果您想在不重新创建父级的情况下从子级导航到父级(调用 onCreate 方法),您可以android:launchMode="singleTop"
在您的AndroidManifest.xml