我已使用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();
}
}
答案 0 :(得分:0)
我经过多次搜索后找到了解决方案。希望以下帮助其他人。
最初,我试图覆盖向上按钮的行为。但是,我得到了一个无法解决的符号'尝试覆盖onOptionsItemSelected时,MenuItem上的错误。也许有办法做到这一点,但我无法弄明白。当我在Android Developer Docs注意到这一点时,我放弃了这种方法:
您无需在活动的onOptionsItemSelected()方法中捕获向上操作。相反,该方法应调用其超类,如响应操作中所示。超类方法通过导航到应用程序清单中指定的父活动来响应向上选择。
<强>解决方案强>
对我有用的解决方案是创建一个自定义工具栏,以便我可以完全定义向上按钮的行为。值得庆幸的是,这只需要几行代码。
第1步 - 创建新的工具栏布局
RES /布局/ toolbar_preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbarPreferences"
android:background="@color/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:elevation="4dp"
android:theme="@style/ToolbarTheme"
app:navigationIcon="?attr/homeAsUpIndicator"
app:titleTextColor="@color/white">
</android.support.v7.widget.Toolbar>
注意上面的一行:
app:navigationIcon="?attr/homeAsUpIndicator"
第2步 - 请参阅首选项布局文件中的新工具栏
就我而言,在我的preferences_layout.xml中:
<include layout="@layout/toolbar_preferences" />
第3步 - Java代码
在SettingsActivity.java中,我不得不:
首先,启动新工具栏:
Toolbar toolbarPref = (Toolbar) findViewById(R.id.toolbarPreferences);
setSupportActionBar(toolbarPref);
其次,设置点击监听器并定义bahaviour:
toolbarPref.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
完成。