gpt4 book ai didi

android - 在 Preference.onSaveInstanceState 中保存什么

转载 作者:太空狗 更新时间:2023-10-29 13:40:23 26 4
gpt4 key购买 nike

我正在为 Android 应用程序创建一些自定义首选项。

我正在创建的两个是 SeekBarPreferenceMultiSelectPreference

SeekBarPreference 非常简单,它继承自 DialogPreference并有一个自定义内容 View ,其中显示 SeekBar .

MultiSelectPreference 更高级一点,它打开一个 Dialog单击时具有自定义 ListView和一个按钮。当按下按钮时,另一个 Dialog 被打开,它有一个通用的 ListView

我应该在 onSaveInstanceState() 中保存什么?对于这些偏好?
对于 SeekBarPreference,我假设如果 isPersistant() 我需要保存该值是错误的,也是当前的 slider 进度(所以我可以恢复)但是浏览android源代码后看起来不像EditTextPreference关心存储它的当前文本,只关心保存的值。

不过,DialogPreference 确实保存了对话框的当前状态,但似乎并没有为它的子项保存状态,但这很难说,我来的时候迷路了什么是Window将在 onSaveInstanceState 被调用时执行,因为它是抽象的并且我没有找到任何子类。

任何对这个问题的见解都将不胜感激,我的目标是稍后开源代码,所以我想正确地做到这一点。

最佳答案

经过大量测试和代码浏览,这些是我的结论:

  • 如果 View 连接到 Root View ,则不需要保存它们的状态,因为它们是在 Root View 保存时保存的,在我的例子中,这意味着我不必保存 SeekBar 的状态,这是父类(super class)保存对话框时的句柄。
  • 如果你不坚持,你应该总是保存你的值(value)
  • 您应该保存所有在首选项创建后更改/可以更改的实例变量,这意味着可以使用 setter 更改或可以随时间更改的变量。

尽管最后一点没有被谷歌遵循,但他们自己是错误的,一个简单的例子说明了原因:假设您有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com