当前位置: 首页 > 知识库问答 >
问题:

从PreferenceFragment返回MainActivity时还原EditText

储国发
2023-03-14

我已经使用PreferenceFragment实现了我的应用程序的设置屏幕。当点击设置屏幕工具栏上的向上按钮时,我的应用程序返回主活动屏幕,但之前输入到EditText(进入设置屏幕之前)的数据丢失,EditText均为空白。

我尝试了实现onSaveInstanceState和onRestoreInstanceState,但它不起作用,因为单击设置屏幕工具栏中的向上按钮时,不会调用onRestoreInstanceState。onCreate中的savedInstanceState也为空。

如果有人能指出如何恢复编辑文本中的数据,我将不胜感激

以下是MainActivity的日志:

点击工具栏菜单中的设置:

I/LOG: on暂停

I/LOG:onSaveInstanceState保存

I/LOG: onStop

点击设置屏幕工具栏中的后退按钮:

I/LOG:onDestroy

I/LOG:onCreate

I/LOG: SavedInstanceState为空

I/LOG:onStart

I/LOG:onResume

主要活动。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();
}

设置活动性。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个答案

郑博
2023-03-14

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

起初,我试图改变“向上”按钮的行为。然而,当我试图覆盖OnOptions ItemSelected时,MenuItem上出现了“无法解析符号”错误。也许有办法做到这一点,但我想不出来。当我在Android开发者文档中注意到这一点时,我放弃了这种方法:

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

解决方案

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

步骤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步-参考首选项布局文件中的新工具栏

在我的例子中,在我的首选项中。xml:

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

步骤3-Java代码

在设置活动中。java,我必须:

首先,启动新工具栏:

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

其次,设置点击监听器并定义行为:

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

完成。

 类似资料:
  • 我正在尝试实现一个Android应用程序,它启动一个子活动,计算我当前位置的坐标。然而,在尝试将数据发送回MainActivity时,我在onActivityResult方法中得到了一个NullPointerException。以下是两个类: } 编辑:这是我的日志 03-13 13:06:59.940 14638-14638/会面。be2015.gcm\U meetup E/AndroidRun

  • 在上使用外部迭代时,我们使用增强的for-each循环中的或作为: 如何使用Java 8 lambda表达式中的内部迭代来或:

  • 问题内容: 当在上使用外部迭代时,我们使用或从增强的循环中获取: 我们如何或在Java 8 lambda表达式中使用内部迭代,例如: 问题答案: 如果需要,则不应使用,而应使用流中可用的其他方法之一。哪一个取决于你的目标是什么。 例如,如果此循环的目标是找到与某些谓词匹配的第一个元素: (注意:这不会迭代整个集合,因为流是惰性计算的-它将在与条件匹配的第一个对象处停止)。 如果你只想知道集合中是否

  • 可以使用保存删除片段时的状态,然后在将片段弹出后堆栈时恢复状态吗?当我从后堆栈还原片段时,savedInstanceState包始终为空。 现在,应用程序流程是:创建的片段->删除的片段(添加到后堆栈)->从后堆栈恢复的片段(savedInstanceState包为空)。 下面是相关代码: 我认为问题是在被移除和添加到后堆栈时从未被调用。如果我不能使用onsavedInstanceState(),

  • “还原”功能会先删除数据库已选择的对象,然后根据你的备份创建新的对象。最后,插入数据。 还原一个备份到现有的数据库或模式 在主窗口中,打开一个数据库或模式。 点击“备份”并选择一个现有的备份文件。 在对象工具栏点击“还原备份”。 选择还原选项并点击“还原”。 还原一个备份到新的数据库或模式 创建并打开一个新的数据库或模式。 点击“备份”。 右击对象选项卡的任意位置并选择“还原备份从”。 浏览备份文

  • “还原”功能会先删除数据库已选择的对象,然后根据你的备份创建新的对象。最后,插入数据。 还原一个备份到现有的数据库或模式 在主窗口中,打开一个数据库或模式。 点击“备份”并选择一个现有的备份文件。 在对象工具栏点击 。 选择还原选项并点击“开始”。 还原一个备份到新的数据库或模式 创建并打开一个新的数据库或模式。 点击“备份”。 按住 Control 键并点按对象选项卡的任意位置,然后选择“还原备