我已经使用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();
}
}
经过多次搜索,我找到了一个解决方案。希望以下内容对其他人有所帮助。
起初,我试图改变“向上”按钮的行为。然而,当我试图覆盖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 键并点按对象选项卡的任意位置,然后选择“还原备