Восстановите EditText при возврате к MainActivity из PreferenceFragment

Я реализовал экран настроек моего приложения, используя PreferenceFragment. При нажатии кнопки "вверх" на панели инструментов экрана настроек мое приложение возвращается к экрану MainActivity, но данные, которые ранее были введены в EditTexts (перед переходом на экран настроек), теряются, и все EditTexts остаются пустыми.

Я попытался реализовать onSaveInstanceState и onRestoreInstanceState, но это не работает, потому что onRestoreInstanceState не вызывается при нажатии кнопки вверх на панели инструментов экрана настроек. SaveInstanceState также является нулевым в onCreate.

Был бы очень признателен, если кто-то мог бы указать, как идти о восстановлении данных в EditTexts, пожалуйста?:)

Вот журнал для MainActivity:

Нажав на Настройки из меню панели инструментов:

I / LOG: onPause

I / LOG: сохранение onSaveInstanceState

I/LOG: onStop

Нажатие на кнопку назад на панели инструментов экрана настроек:

I / LOG: onDestroy

I / LOG: onCreate

I / LOG: сохраненное значение InstanceState равно нулю

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 ответ

Я нашел решение после долгих поисков. Надеюсь, что следующее поможет кому-то еще там.

Сначала я попытался изменить поведение кнопки "вверх". Однако я получаю сообщение об ошибке "не удается разрешить символ" в MenuItem при попытке переопределить onOptionsItemSelected. Возможно, есть способ сделать это, но я не мог понять это. Я отказался от этого подхода, когда заметил это в Документах для разработчиков Android:

Вам не нужно перехватывать действие up в методе onOptionsItemSelected() действия. Вместо этого этот метод должен вызывать свой суперкласс, как показано в разделе "Ответить на действия". Метод суперкласса отвечает на выбор Up путем перехода к родительскому действию, как указано в манифесте приложения.

Решение

Решение, которое сработало для меня, заключалось в создании настраиваемой панели инструментов, чтобы я мог полностью определить поведение кнопки "вверх". К счастью, для этого потребовалось всего несколько строк кода.

Шаг 1 - Создайте новый макет панели инструментов

разреш / макет /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 - Обратитесь к новой панели инструментов в файле макета настроек

В моем случае, в моем предпочтении_layout.xml:

<include layout="@layout/toolbar_preferences" />

Шаг 3 - Java-код

В SettingsActivity.java мне пришлось:

Сначала запустите новую панель инструментов:

Toolbar toolbarPref = (Toolbar) findViewById(R.id.toolbarPreferences);
    setSupportActionBar(toolbarPref);

Во-вторых, установите прослушиватель click и определите bahaviour:

toolbarPref.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

Готово.

Другие вопросы по тегам