在bundle测试中设置编辑文本不起作用



嗨,我正在练习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的值设置mTextBoxEditText仍然设置为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"));
}
}

最新更新