Восстановите 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();
}
});
Готово.