在不丢失用户输入数据的情况下在意图之间来回切换
Going back and forth between intents without losing user entered data
我有一个表格。在这里,用户填写事件名称、描述、位置等详细信息。为了 select 位置,我设置了一个按钮。这是我的按钮代码:
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);
}
});
我select那里的位置,数据正确传回我的主要意图。但问题是,用户填写的事件、描述等其他字段的数据丢失了。
我也试过startActivityForResult(map,1);
。不起作用。有没有办法保留数据,而不会将它们打包发送到另一个意图并取回它们?就像 select 图片按钮一样?它进入画廊并在不重置其他字段的情况下返回
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);
}
});
您需要保存您的 activity 状态。
覆盖方法 onSaveInstanceState
并将所有数据保存在包中
在onCreate
中,如果savedInstanceState
不为空,恢复所有数据并设置所有字段。
@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
}
}
详情here
注意:您提到旋转被阻止。这通常对用户不利,除非它是应用程序功能的一部分。
解释:
屏幕旋转是一种配置更改,它会导致 activity 使用适当的资源重新启动。还有更多的配置更改,例如屏幕解锁、设备停靠等。并非所有这些都会触发 activity 重启,但有些会。当您的 activity 由于配置更改而重新启动时,将调用 onSaveInstanceState
并且当 onCreate
被调用时 savedInstanceState
将不为空。
当您开始一个新的 activity Android 可能 销毁前一个以恢复它正在消耗的一些资源。在那种情况下,当你 return 到之前的 activity 时,它实际上是 Activity
子类的新实例并且内部状态已经丢失。您可以分别在 onSaveInstanceState and onCreate 回调方法中保存和恢复任何必要的状态。
查看此页面以获取更多信息和示例:Recreating an Activity | Android Developers
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...
}
我有一个表格。在这里,用户填写事件名称、描述、位置等详细信息。为了 select 位置,我设置了一个按钮。这是我的按钮代码:
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);
}
});
我select那里的位置,数据正确传回我的主要意图。但问题是,用户填写的事件、描述等其他字段的数据丢失了。
我也试过startActivityForResult(map,1);
。不起作用。有没有办法保留数据,而不会将它们打包发送到另一个意图并取回它们?就像 select 图片按钮一样?它进入画廊并在不重置其他字段的情况下返回
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);
}
});
您需要保存您的 activity 状态。
覆盖方法 onSaveInstanceState
并将所有数据保存在包中
在onCreate
中,如果savedInstanceState
不为空,恢复所有数据并设置所有字段。
@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
}
}
详情here
注意:您提到旋转被阻止。这通常对用户不利,除非它是应用程序功能的一部分。
解释:
屏幕旋转是一种配置更改,它会导致 activity 使用适当的资源重新启动。还有更多的配置更改,例如屏幕解锁、设备停靠等。并非所有这些都会触发 activity 重启,但有些会。当您的 activity 由于配置更改而重新启动时,将调用 onSaveInstanceState
并且当 onCreate
被调用时 savedInstanceState
将不为空。
当您开始一个新的 activity Android 可能 销毁前一个以恢复它正在消耗的一些资源。在那种情况下,当你 return 到之前的 activity 时,它实际上是 Activity
子类的新实例并且内部状态已经丢失。您可以分别在 onSaveInstanceState and onCreate 回调方法中保存和恢复任何必要的状态。
查看此页面以获取更多信息和示例:Recreating an Activity | Android Developers
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...
}