从 Edittext 保存最新文本并在 onDestroy 之后恢复它
Save latest text from Edittext and restore it after onDestroy
对于我的名言创作者应用程序,如果用户在应用程序中写了一段文字,然后不小心关闭了应用程序并再次启动,那么所有文本都会消失。我当然想阻止这种情况,我已经尝试了一个没有成功的通用解决方案:
这就是我到目前为止所做的。我已经删除了不相关的代码。
public static EditText mEditText;
private String savedText;
private static final String SAVED_TEXT_KEY = "";
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
savedText = SAVED_TEXT_KEY;
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(SAVED_TEXT_KEY);
String myString = savedInstanceState.getString(SAVED_TEXT_KEY);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edittext);
mEditText.setTypeface(Style.getTypeface(this, Style.SERIF));
savedText = mEditText.getText().toString();
mEditText.setText(SAVED_TEXT_KEY);
if(savedInstanceState !=null){
savedText = savedInstanceState.getString(SAVED_TEXT_KEY);
}
}
如果我没看错,那么你就不要再在 textview 上设置文本了。
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
super.onSaveInstanceState(outState);
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edittext);
mEditText.setTypeface(Style.getTypeface(this, Style.SERIF));
if (savedInstanceState != null) {
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
}
这应该可以解决问题。
首先,您应该为 SAVED_KEY_TEXT.
提供一个正确的密钥,而不是一个空字符串
private static final String SAVED_TEXT_KEY = "some_key";
然后,您应该将您的 onCreate 更新为:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edittext);
mEditText.setTypeface(Style.getTypeface(this, Style.SERIF));
if(savedInstanceState !=null){
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
}
你的 onRestoreInstanceState 是这样的:
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
最后你的 onSaveInstanceState 是这样的:
public void onSaveInstanceState(Bundle outState) {
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
super.onSaveInstanceState(outState);
}
试试这个:
通过覆盖此保存您的状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY, mEditText.getText().toString());
}
并恢复它:
public void onCreate(Bundle savedInstanceState) {
if(savedInstanceState != null)
{
mEditText.setText(savedInstanceState.getString(KEY));
}
}
public EditText mEditText;
private static final String SAVED_TEXT_KEY = "SAVED_TEXT_KEY";
private SharedPreferences prefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.editText);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
mEditText.setText(prefs.getString(SAVED_TEXT_KEY,""));
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
@Override
public void onDestroy() {
super.onDestroy();
SharedPreferences.Editor editor = prefs.edit();
editor.putString(SAVED_TEXT_KEY,mEditText.getText().toString());
editor.commit();
}
使用 IcePick 库:https://github.com/frankiesardo/icepick
@State 字符串用户名; // 这将自动保存和恢复
看来是我处理这个问题的方法不对。根据建议,我使用 SharedPreferences 来保存当前文本。
public static final String LAST_TEXT = "";
final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
mEditText.setText(pref.getString(LAST_TEXT, ""));
mEditText.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) {
pref.edit().putString(LAST_TEXT, s.toString()).commit();
}
});
对于我的名言创作者应用程序,如果用户在应用程序中写了一段文字,然后不小心关闭了应用程序并再次启动,那么所有文本都会消失。我当然想阻止这种情况,我已经尝试了一个没有成功的通用解决方案:
这就是我到目前为止所做的。我已经删除了不相关的代码。
public static EditText mEditText;
private String savedText;
private static final String SAVED_TEXT_KEY = "";
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
savedText = SAVED_TEXT_KEY;
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(SAVED_TEXT_KEY);
String myString = savedInstanceState.getString(SAVED_TEXT_KEY);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edittext);
mEditText.setTypeface(Style.getTypeface(this, Style.SERIF));
savedText = mEditText.getText().toString();
mEditText.setText(SAVED_TEXT_KEY);
if(savedInstanceState !=null){
savedText = savedInstanceState.getString(SAVED_TEXT_KEY);
}
}
如果我没看错,那么你就不要再在 textview 上设置文本了。
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
super.onSaveInstanceState(outState);
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edittext);
mEditText.setTypeface(Style.getTypeface(this, Style.SERIF));
if (savedInstanceState != null) {
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
}
这应该可以解决问题。
首先,您应该为 SAVED_KEY_TEXT.
提供一个正确的密钥,而不是一个空字符串private static final String SAVED_TEXT_KEY = "some_key";
然后,您应该将您的 onCreate 更新为:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edittext);
mEditText.setTypeface(Style.getTypeface(this, Style.SERIF));
if(savedInstanceState !=null){
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
}
你的 onRestoreInstanceState 是这样的:
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
最后你的 onSaveInstanceState 是这样的:
public void onSaveInstanceState(Bundle outState) {
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
super.onSaveInstanceState(outState);
}
试试这个:
通过覆盖此保存您的状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY, mEditText.getText().toString());
}
并恢复它:
public void onCreate(Bundle savedInstanceState) {
if(savedInstanceState != null)
{
mEditText.setText(savedInstanceState.getString(KEY));
}
}
public EditText mEditText;
private static final String SAVED_TEXT_KEY = "SAVED_TEXT_KEY";
private SharedPreferences prefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.editText);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
mEditText.setText(prefs.getString(SAVED_TEXT_KEY,""));
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SAVED_TEXT_KEY, mEditText.getText().toString());
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditText.setText(savedInstanceState.getString(SAVED_TEXT_KEY));
}
@Override
public void onDestroy() {
super.onDestroy();
SharedPreferences.Editor editor = prefs.edit();
editor.putString(SAVED_TEXT_KEY,mEditText.getText().toString());
editor.commit();
}
使用 IcePick 库:https://github.com/frankiesardo/icepick
@State 字符串用户名; // 这将自动保存和恢复
看来是我处理这个问题的方法不对。根据建议,我使用 SharedPreferences 来保存当前文本。
public static final String LAST_TEXT = "";
final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
mEditText.setText(pref.getString(LAST_TEXT, ""));
mEditText.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) {
pref.edit().putString(LAST_TEXT, s.toString()).commit();
}
});