【发布时间】:2017-12-05 03:11:17
【问题描述】:
我已经使用 PreferenceFragment 实现了我的应用程序的设置屏幕。 当单击设置屏幕工具栏中的向上按钮时,我的应用程序返回到 MainActivity 屏幕,但之前输入到 EditTexts 的数据(在进入设置屏幕之前)丢失了,并且 EditTexts 都是空白的。
我尝试实现 onSaveInstanceState 和 onRestoreInstanceState 但它不起作用,因为单击设置屏幕工具栏中的向上按钮时未调用 onRestoreInstanceState。在 onCreate 中的 savedInstanceState 也是 null。
如果有人能指出如何恢复 EditTexts 中的数据,我将不胜感激? :)
这是 MainActivity 的日志:
从工具栏菜单点击设置:
I/LOG:onPause
I/LOG:onSaveInstanceState 保存
I/LOG:onStop
单击设置屏幕工具栏中的后退按钮:
I/LOG:onDestroy
I/LOG:onCreate
I/LOG:savedInstanceState 为空
I/LOG:onStart
I/LOG: onResume
MainAcitivy.java
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.EditText;
import android.util.Log;
//...
public class MainActivity extends AppCompatActivity {
Toolbar toolbarMain;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("LOG", "onCreate");
super.onCreate(savedInstanceState);
Log.i("LOG", "savedInstanceState is " + savedInstanceState);
if(savedInstanceState !=null) {
editText.setText(savedInstanceState.getString("ET_KEY"), TextView.BufferType.EDITABLE);
}
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.myEditText);
toolbarMain = (Toolbar) findViewById(R.id.toolbar);
toolbarMain.setTitle(R.string.app_name);
toolbarMain.inflateMenu(R.menu.menu_main);
toolbarMain.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.settings:
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
}
return true;
}
});
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i("LOG", "onRestoreInstanceState");
super.onRestoreInstanceState(savedInstanceState);
editText.setText(savedInstanceState.getString("ET_KEY"), TextView.BufferType.EDITABLE);
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.i("LOG", "onSaveInstanceState saving");
outState.putString("ET_KEY", editText.getText().toString());
}
@Override
public void onPause() {
Log.i("LOG", "onPause");
super.onPause();
}
@Override
public void onStop() {
Log.i("LOG", "onStop");
super.onStop();
}
@Override
public void onDestroy() {
Log.i("LOG", "onDestroy");
super.onDestroy();
}
@Override
public void onStart() {
Log.i("LOG", "onStart");
super.onStart();
}
@Override
public void onResume() {
Log.i("LOG", "onResume");
super.onResume();
}
SettingsActivity.java
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class SettingsActivity extends AppCompatActivity {
SharedPreferences sharedPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferences_layout);
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(R.id.pref_content, new SettingsFragment())
.commit();
}
}
【问题讨论】:
-
你不需要保存状态。除非你在第一次活动时调用finish()或者改变方向,否则数据不会丢失。Check this
-
我不太明白您要我检查的 SO 线程中的讨论。我注意到当我单击导航栏上的后退按钮时
-
... 注意到只有 onStart 然后 onResume 被调用并且edittext仍然有它的数据;我猜这意味着状态没有丢失。所以在我看来,我需要覆盖工具栏上的向上按钮如何模仿后退导航按钮的按下?如果是这样,我该怎么做?
标签: java android android-edittext back preferencefragment