在Bundle测试中设置EditText不起作用

时间:2017-08-04 02:47:21

标签: java android android-bundle

您好我正在练习df.toPandas().to_csv("sample_file.csv", header=True)如何在活动创建和恢复中发挥作用。我试过这个:

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()字段设置为" hello"如果EditText为空,则不会执行savedInstanceState块。当我更改方向时if遍历所有回调并在Activity块中烘烤字符串,但是,它不会将if设置为传递的mTextBox值。Bundle仍然设置为EditText而不是hello,但if块中的Joe显示为Toast

有人能指出为什么这不符合我的期望吗?

由于

2 个答案:

答案 0 :(得分:2)

这是TextView.getFreezesText的结果,它将:

  

返回此文本视图是否包含其中的整个文本内容   冰冻的冰柱。 对于EditText,它始终返回true

来自TextView.setFreezesText的更多信息:

  

控制此文本视图是否在何时保存其整个文本内容   冻结到冰柱,除了光标等动态状态   位置。默认情况下,这是false,不保存文本。设为true   如果文本视图中的文本没有保存在其他地方   持久存储(如在内容提供者中),以便视图   稍后解冻用户不会丢失他们的数据。 对于EditText,它是   始终启用,无论属性值

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"));
}

答案 1 :(得分:1)

你需要setText不同"你好"。见例子

animations

或者您必须覆盖onRestoreInstanceState。当文本没有改变时,不要调用onCreate。

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);
}