从PreferenceFragment返回MainActivity时还原EditText

时间:2017-07-01 07:50:58

标签: java android android-edittext back preferencefragment

我已使用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();
}
}

1 个答案:

答案 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();
        }
    });

完成。