13

所以我有一个活动 A 和一个活动 B。我希望活动 A 能够通过按下按钮导航到活动 B。这行得通,但是当我使用向上导航(操作栏中的主页按钮)导航回活动 A 时,再次调用 onCreate() 并且用户输入的旧信息丢失了。

我已经看到:onCreate 总是在以 intent 导航返回时调用,但他们使用了 Fragments,我希望不必重新设计整个应用程序来使用 Fragment。每次活动 A 再次激活时,有什么方法可以阻止 onCreate() 被调用?

4

3 回答 3

16

这种行为是完全正常的,也是想要的。系统可能决定停止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);
}
于 2013-10-07T03:03:14.307 回答
15

您可以通过覆盖使向上按钮的行为类似于按回onSupportNavigateUp()

 @Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
于 2015-12-31T13:52:23.740 回答
7

如果您想在不重新创建父级的情况下从子级导航到父级(调用 onCreate 方法),您可以android:launchMode="singleTop"在您的AndroidManifest.xml

于 2017-11-30T19:19:17.080 回答