嗨,我正在练习Bundle savedInstanceState
如何在活动创建和恢复中工作。我试过这个:
private EditText mTextBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextBox = (EditText) findViewById(R.id.etName);
mTextBox.setText("hello");
if(savedInstanceState != null){
Toast.makeText(this, savedInstanceState.getString("name"),
Toast.LENGTH_SHORT).show();
mTextBox.setText(savedInstanceState.geteString("name"));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("name", "Joe");
super.onSaveInstanceState(outState);
}
首先onCreate()
显然这会将EditText
字段设置为"hello",因为savedInstanceState
为空,则不会执行if
块。当我更改方向时,Activity
会遍历所有回调并在if
块中吐槽字符串,但是,它不会使用传入Bundle
的值设置mTextBox
。EditText
仍然设置为hello
而不是Joe
,但是,if块中的Toast
显示Joe
。
谁能指出为什么这不符合我的期望?
谢谢
这是由于TextView.getFreezesText
而发生的,它将:
返回此文本视图是否包含其整个文本内容 冰冻的冰柱。对于编辑文本,它始终返回 true。
以及来自TextView.setFreezesText
的更多信息:
控制此文本视图在以下情况下是否保存其整个文本内容 冻结成冰柱,除了动态状态,如光标 位置。默认情况下,这是假的,不保存文本。设置为 true 如果文本视图中的文本未保存在 持久存储(例如在内容提供程序中(以便如果视图 解冻后,用户不会丢失其数据。对于编辑文本,它是 始终启用,无论属性的值如何。
icicles
指的是savedInstanceState
,这就是它过去的名字。
如果您想自己保存和恢复文本,您可以创建自定义EditText
并覆盖getFreezesText
,如下所示:
public class NonFreezingEditText extends AppCompatEditText {
public NonFreezingEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean getFreezesText() {
return false;
}
}
您也可以使用View.post
:
mTextBox.post(() -> mTextBox.setText(savedInstanceState.getString("name")));
或Activity.onRestoreInstanceState
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mTextBox.setText(savedInstanceState.getString("name"));
}
你需要设置文本不同的"hello"。
private EditText mTextBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextBox = (EditText) findViewById(R.id.etName);
mTextBox.setText("hello");
if(savedInstanceState != null){
Toast.makeText(this, savedInstanceState.getString("name"),
Toast.LENGTH_SHORT).show();
mTextBox.setText(savedInstanceState.getString("name"));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
mTextBox.setText("Joe");
outState.putString("name", mTextBox.getText().toString());
super.onSaveInstanceState(outState);
}
或者您必须覆盖 onRestoreInstanceState。当文本未更改时不调用创建。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if(savedInstanceState != null){
mTextBox.setText(savedInstanceState.getString("name"));
}
}