【问题标题】:Restore EditText when going back to MainActivity from PreferenceFragment从 PreferenceFragment 返回 MainActivity 时恢复 EditText
【发布时间】: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


【解决方案1】:

经过大量搜索,我找到了解决方案。希望以下内容对其他人有所帮助。

最初,我试图覆盖向上按钮的行为。但是,在尝试覆盖 onOptionsItemSelected 时,我在 MenuItem 上收到“无法解析符号”错误。也许有办法做到这一点,但我无法弄清楚。当我在Android Developer Docs 中注意到这一点时,我放弃了这种方法:

您不需要在 Activity 的 onOptionsItemSelected() 方法中捕捉 up 动作。相反,该方法应该调用其超类,如响应操作中所示。超类方法通过导航到应用清单中指定的父 Activity 来响应 Up 选择。

解决方案

一个对我有用的解决方案是创建一个自定义工具栏,以便我可以完全定义向上按钮的行为。幸运的是,这只需要几行代码。

第 1 步 - 创建新的工具栏布局

res/layout/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);

二、设置点击监听并定义行为:

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

完成。

【讨论】:

猜你喜欢
  • 2013-04-13
  • 2020-03-11
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多