2017-08-04 58 views
0

嗨,我正在练习Bundle savedInstanceState如何在活动创建和恢复中工作。我曾经尝试这样做:在捆绑测试中设置EditText测试不起作用

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场“你好”作为savedInstanceState是空的if块将不会被执行。当我改变Activity经过所有的回调和烤面包的if块字符串的方向,但是,它不会与Bundle传入值设置mTextBoxEditText仍然设置为hello,而不是Joe,然而,Toast如果区块显示Joe

任何人都可以指出为什么这不符合我的期望?

谢谢

+0

是不是你应该使用mTextBox。 setText() name.setText(savedInstanceState.geteString(“name”)); 部分? – Sheychan

+0

对不起,我已经从AS复制了我的代码并在此处更改了变量名称,但错过了更改该变量的名称,现在它已更新。感谢您发现错误。 – dhssa

+0

你应该使用https://github.com/frankiesardo/icepick –

回答

2

这是发生由于TextView.getFreezesText结果,这将:

返回是否该文本视图包括 冻结冰柱其整个文本内容。 对于EditText,它始终返回true

而且从TextView.setFreezesText一些更多的信息:

控制这个文本视图是否保存它的整个文本内容时 冻冰柱,除了动态状态,诸如光标 位置。默认情况下,这是错误的,不保存文本。设置为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")); 
} 
+0

谢谢我已经使用onRestoreInstanceState(),因为它更容易,然后自定义EditText。 – dhssa

1

你需要setText不同的“你好”。见示例

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。当文字没有改变时,不要调用onCreate。

@Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    if(savedInstanceState != null){ 
     mTextBox.setText(savedInstanceState.getString("name")); 
    } 
    } 
相关问题