在意图之间来回走动而不会丢失用户输入数据



我有一个表格。在这里,用户填写了诸如事件名称,描述,位置等的详细信息。选择位置,我设置了一个按钮。这是我的按钮代码:

btnMap.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent map = new Intent(getApplicationContext(), Map2.class);
            startActivity(map);
        }
    });

我从那里选择位置,数据将正确回到我的主要意图。但事实是,其他字段中的数据(例如事件,描述等)丢失了。

我也尝试了startActivityForResult(map,1);。行不通。有没有办法保留数据,而不会将它们捆绑到另一个意图并使它们恢复原状?像选择图像按钮一样?它去了画廊,回来而无需重置其他字段

contactImageImgView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Select Image"), 1);
        }
    });

您需要保存活动状态。

覆盖方法onSaveInstanceState并将您的所有数据持续到捆绑包

onCreate中,如果savedInstanceState不是null,请还原所有数据并设置所有字段。

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putInt("MY_FIELD", 43);
    // ... other fields

    super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    if (savedInstanceState != null) {
        int value = savedInstanceState.getInt("MY_FIELD");
        // ... update your views

    } else {
        // no previous state, start fresh
    }
}

详细信息在这里

注意:您提到旋转被阻塞。除非用户是应用程序功能的一部分,否则这通常对用户不利。

说明:

屏幕旋转是一种配置更改,可导致活动使用适当的资源重新启动。还有更多的配置更改,例如屏幕解锁,设备停靠等。并非所有这些都触发活动重新启动,而是有些会触发。当您的活动因配置更改而重新启动时,onSaveInstanceState被调用,而savedInstanceState将在 onCreate被调用时不会被纳入。

启动新的活动时,Android May 销毁了前一个活动以恢复其所消耗的一些资源。在这种情况下,当您返回以前的活动时,它实际上是Activity子类的新实例,并且内部状态已丢失。分别在OnSaveInstancestate和Ongreate回调方法中保存和恢复任何必要状态。

请查看此页面以获取更多信息和示例:重新创建活动|Android开发人员

public class FormActivity extends Activity {
    private static final String NAME = "NAME";
    private EditText nameEdit;
    // Declare other view references here...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);
        nameEdit = (EditText) findViewById(R.id.name_edit);
        // Find other views...
        if (savedInstanceState != null) {
            final String nameValue = savedInstanceState.getString(NAME, "");
            nameEdit.setText(nameValue);
            // Restore other saved values...
        } else {
            // No saved values to restore
        }
    }
    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        final String nameValue = nameEdit.getText().toString()
        outState.putString(NAME, nameValue);
        // Put (save) other values into the outState bundle...
        super.onSaveInstanceState(outState, outPersistentState);
    }
    // Other FormActivity code...
}

最新更新