- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为 Android 应用程序创建一些自定义首选项。
我正在创建的两个是 SeekBarPreference
和 MultiSelectPreference
。
SeekBarPreference
非常简单,它继承自 DialogPreference
并有一个自定义内容 View ,其中显示 SeekBar
.
MultiSelectPreference
更高级一点,它打开一个 Dialog
单击时具有自定义 ListView
和一个按钮。当按下按钮时,另一个 Dialog
被打开,它有一个通用的 ListView
。
我应该在 onSaveInstanceState()
中保存什么?对于这些偏好?
对于 SeekBarPreference
,我假设如果 isPersistant()
我需要保存该值是错误的,也是当前的 slider 进度(所以我可以恢复)但是浏览android源代码后看起来不像EditTextPreference
关心存储它的当前文本,只关心保存的值。
不过,DialogPreference
确实保存了对话框的当前状态,但似乎并没有为它的子项保存状态,但这很难说,我来的时候迷路了什么是Window
将在 onSaveInstanceState
被调用时执行,因为它是抽象的并且我没有找到任何子类。
任何对这个问题的见解都将不胜感激,我的目标是稍后开源代码,所以我想正确地做到这一点。
最佳答案
经过大量测试和代码浏览,这些是我的结论:
尽管最后一点没有被谷歌遵循,但他们自己是错误的,一个简单的例子说明了原因:假设您有一个 PreferenceActivity,其中包含两件事;一个ListPreference
有 10 个项目和一个通用首选项,当按下时将一个项目添加到 ListPreference 的末尾。
现在假设用户启动应用程序并按下通用首选项,ListPreference 现在有 11 个项目。用户现在打开 ListPreference。
如果应用程序关闭然后终止,实例将被保存,但 ListView 仅保存存储的值(如果它不是持久的),因此当它重新打开时它只包含最初的 10 个项目。
下面是一个显示问题的最小应用程序示例,只需单击按钮,打开列表(应该有 4 个项目),在打开列表的情况下关闭应用程序,从 adb 中终止应用程序并重新打开它,该列表现在包含三个项目。
PreferenceTest.java
package com.example;
import java.util.ArrayList;
import java.util.Arrays;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
public class PreferenceTest extends PreferenceActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
getPreferenceScreen().findPreference("button").setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
ListPreference lp = (ListPreference) getPreferenceScreen().findPreference("list");
ArrayList<CharSequence> al = new ArrayList<CharSequence>(Arrays.asList(lp.getEntries()));
CharSequence items[] = new CharSequence[al.size()+1];
al.add("Item " + items.length);
lp.setEntries(al.toArray(items));
al = new ArrayList<CharSequence>(Arrays.asList(lp.getEntryValues()));
al.add("Value " + items.length);
lp.setEntryValues(al.toArray(items));
return true;
}
});
}
}
res/xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:key="list"
android:entries="@array/list_entries"
android:entryValues="@array/list_values"
android:title="Example list"
android:summary="This list contains 3 items by default" />
<Preference
android:key="button"
android:title="Example button"
android:summary="When clicked this adds an item to the list" />
</PreferenceScreen>
res/values/list_items.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="list_entries">
<item>Item 1</item>
<item>Item 2</item>
<item>Item 3</item>
</string-array>
<string-array name="list_values">
<item>Value 1</item>
<item>Value 2</item>
<item>Value 3</item>
</string-array>
</resources>
关于android - 在 Preference.onSaveInstanceState 中保存什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6514418/
我是 Android 开发新手。我正在使用 onSaveInstanceState() 的覆盖版本来保存我自己的应用程序数据。我注意到我没有在我的函数中调用 super.onSaveInstanceS
如果我将在不调用 super.onSaveInstanceState(outState) 的情况下使用此代码; @Override protected void onSaveInstanceState
我在 fragment 兼容性包示例之后创建了一个 fragment 选项卡小部件,我在 onTabChanged 中更改了 fragment ,但我有一些市场报告在 onSaveInstanceSt
当我离开我的 Activity 时,为什么我的应用程序崩溃了?更具体地说:在我实现 onSaveInstanceState() 之前一切正常和 onRestoreInstanceState() 这是代
我有一个 Activity ,它启动结果代码的各种 Activity ,并在 onActivityResult 方法中获取结果时,它根据结果代码启动适当的 Activity 。 onSaveInsta
我在 onSaveInstanceState 上保存当前进度条时遇到问题。我保存当前正在进行的时间,但是当退出 Activity 并返回时恢复进度不显示剩余时间。 该类显示进度条 public cla
我想实现什么目标? 我想保存 x、y 和 score 的值,因此当用户旋转屏幕时,会检索这些值,而不是重获新生。 我有什么? 可能是正确的 onSaveInstanceState 代码,但由于某些 @
所以我了解了如何使用的主要想法 protected void onSaveInstanceState (Bundle outState) http://developer.android.com/
考虑以下代码,它将静态变量:mMyArray 保存在 onSaveInstanceState 中,并在 onRestoreInstanceState 中恢复它,但是我发现它根本无法保存 int 数组。
当我的应用程序变得复杂并且主要 Activity 开始在内存中保存大量数据(响应用户操作从文件加载和解析)时,我(错误地)从 onSaveInstanceState 切换到 onRetainNonCo
我是我应用的 onSaveInstanceState 实现。我已经成功实现了我的 onSaveInstanceState,但它不会在方向更改时保持当前问题。以下是我的 MainActivity。我一直
我正在尝试在单击后退按钮时保存和检索我的 Activity 的 onSaveInstanceState()。我读过默认情况下它不会保存,因为假设用户在单击返回时已完成 Activity 。但是,在我的
我已经阅读了android文档中的以下声明 Because onSaveInstanceState() is not guaranteed to be called, you should use i
我有几个扩展 LinearLayout 的自定义组件。 现在我想在屏幕方向改变时保存/恢复它们的状态,但我不能通过 Activity 的 onSaveInstanceState/onRestoreIn
我正在尝试了解生命周期方法和 onSaveInstanceState()。 我实际上只需要担心 onCreate() 和 onPause() 是否正确? onCreate()? 我可以/应该忽略 on
我是 Android 开发的新手,我有一个关于 onSaveInstanceState() 的问题。我目前正在处理一个应用程序的登录 Activity 。为了检查用户是否可以登录他们的帐户,我对服务器
我正在编写一个程序,我在同一个 Activity 中调用多个布局,但后来我注意到当我切换布局时,切换之前所做的更改不会恢复并且 onSavedInstanceState(Bundle outState
当 android 由于系统限制而杀死您的进程时,它使您能够通过将数据存储在一个包中来跨进程持久保存数据。如果您的进程被终止,这个包保存在哪里?它存在于哪个进程中?它住在内存中的什么地方?它存在于内核
我在我的 android Activity 中实现了 onSaveInstanceState 和 onRestoreInstanceState。 这些似乎工作正常,但我想在某些事情发生时(例如,当用户
我的问题似乎与其他人相反。 :) 每当我从一个 Activity 导航到下一个 Activity 时,都会调用我的 onSaveInstanceState。我检查了 LogCat,它绝对不会终止 Ac
我是一名优秀的程序员,十分优秀!