在Android开发中,EditText
是一个常用的控件,用于接收用户输入的文本。当尝试旋转设备时,可能会遇到 EditText
的值无法保存的问题。这通常是由于Activity在配置变化(如屏幕旋转)时被销毁并重新创建,导致之前的数据丢失。
onSaveInstanceState()
方法来保存状态,然后在 onCreate()
或 onRestoreInstanceState()
方法中恢复状态。onSaveInstanceState()
方法保存状态。onCreate()
或 onRestoreInstanceState()
方法恢复状态。onSaveInstanceState()
和 onRestoreInstanceState()
在Activity中重写 onSaveInstanceState()
方法来保存 EditText
的值,然后在 onCreate()
或 onRestoreInstanceState()
方法中恢复这个值。
public class MainActivity extends AppCompatActivity {
private EditText editText;
private static final String TEXT_KEY = "text_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editText);
if (savedInstanceState != null) {
String savedText = savedInstanceState.getString(TEXT_KEY);
editText.setText(savedText);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String text = editText.getText().toString();
outState.putString(TEXT_KEY, text);
}
}
使用Android Architecture Components中的 ViewModel
可以更好地管理UI相关的数据,避免因配置变化导致的数据丢失。
首先,添加依赖:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.5.1"
然后,创建一个 ViewModel
类:
public class MyViewModel extends ViewModel {
private MutableLiveData<String> text = new MutableLiveData<>();
public LiveData<String> getText() {
return text;
}
public void setText(String value) {
text.setValue(value);
}
}
在Activity中使用 ViewModel
:
public class MainActivity extends AppCompatActivity {
private EditText editText;
private MyViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editText);
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getText().observe(this, new Observer<String>() {
@Override
public void onChanged(String value) {
editText.setText(value);
}
});
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
viewModel.setText(s.toString());
}
});
}
}
通过以上方法,可以有效解决 EditText
在旋转设备时无法保存值的问题。
领取专属 10元无门槛券
手把手带您无忧上云