从列表首选项获取整数或索引值

我在共享首选项中创build列表,并且在调用onPreferenceChanged()方法时,我想在某些情况下提取列表中项目的索引或整数值。 我想build立的XML数据如下:

在数组中:

<string-array name="BackgroundChoices"> <item>Dark Background</item> <item>Light Background</item> </string-array> <array name="BackgroundValues"> <item>1</item> <item>0</item> </array> <string-array name="SpeedChoices"> <item>Slow</item> <item>Medium</item> <item>Fast</item> </string-array> <array name="SpeedValues"> <item>1</item> <item>4</item> <item>16</item> </array> 

在首选项xml文件中:

 <PreferenceScreen android:key="Settings" xmlns:android="http://schemas.android.com/apk/res/android" android:title="Settings"> <ListPreference android:key="keyBackground" android:entries="@array/BackgroundChoices" android:summary="Select a light or dark background." android:title="Light or Dark Background" android:positiveButtonText="Okay" android:entryValues="@array/BackgroundValues"/> <ListPreference android:key="keySpeed" android:entries="@array/SpeedChoices" android:summary="Select animation speed." android:title="Speed" android:entryValues="@array/SpeedValues"/> </PreferenceScreen> 

所以我的XML不起作用。 我知道如何做这个使用string数组而不是数组的值。 我可以把值串取出来,并从中得到我想要的,但是我宁愿(如果可能的话)能够列出值为int,布尔值或枚举值的列表。 习惯性的做法是什么?

提前致谢,

松鸦

Solutions Collecting From Web of "从列表首选项获取整数或索引值"

将首选项设置为String并使用Integer.parseInt() 。 我认为实际上有一个关于你提到的限制的错误报告,但我找不到链接。 从经验中,我可以告诉你只要使用Strings并保存自己很多的挫折。

请注意其他SO用户,如果你能certificate我错了,我很欢迎。

安德鲁是正确的,线程在这里 :

它仍然被评论,但没有改变(反正2.3.3)。

.valueOf()的Integer.parseInt()将不得不工作。 如果valueOf()工作没有错误,使用它,因为它不会像parseInt()那样分配,当你需要像我一样避免GC的时候有用。

基于Android的ListPreference,我创build了IntListPreference 。 用法很简单 – 只需将此代码片段放入您的首选项xml:

 <org.bogus.android.IntListPreference android:key="limitCacheLogs" android:defaultValue="20" android:entries="@array/pref_download_logs_count_titles" android:entryValues="@array/pref_download_logs_count_values" android:negativeButtonText="@null" android:positiveButtonText="@null" android:title="@string/pref_download_logs_count" /> 

那在strings.xml中

 <string name="pref_download_logs_count">Number of logs per cache</string> <string-array name="pref_download_logs_count_titles"> <item>10</item> <item>20</item> <item>50</item> <item>Give me all!</item> </string-array> <integer-array name="pref_download_logs_count_values"> <item>10</item> <item>20</item> <item>50</item> <item>-1</item> </integer-array> 

这是我使用的一个ListIntegerPreference类(为com.android.support:preference-v7:24.0.0编写)。 它会覆盖一些方法,并在可能的情况下在IntegerString之间进行转换,以便基本ListPreference不会识别您正在使用Integers而不是Strings

 public class ListIntegerPreference extends ListPreference { public ListIntegerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public ListIntegerPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public ListIntegerPreference(Context context, AttributeSet attrs) { super(context, attrs); } public ListIntegerPreference(Context context) { super(context); } @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { int defValue = defaultValue != null ? Integer.parseInt((String)defaultValue) : 0; int value = getValue() == null ? 0 : Integer.parseInt(getValue()); this.setValue(String.valueOf(restoreValue ? this.getPersistedInt(value) : defValue)); } @Override public void setValue(String value) { try { Field mValueField = ListPreference.class.getDeclaredField("mValue"); mValueField.setAccessible(true); Field mValueSetField = ListPreference.class.getDeclaredField("mValueSet"); mValueSetField.setAccessible(true); String mValue = (String)mValueField.get(this); boolean mValueSet = (boolean)mValueSetField.get(this); boolean changed = !TextUtils.equals(mValue, value); if(changed || !mValueSet) { mValueField.set(this, value); mValueSetField.set(this, mValueSet); this.persistInt(Integer.parseInt(value)); if(changed) { this.notifyChanged(); } } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } 

我用这个通过代码创buildListPreferences值,只是尝试它。 它可能马上工作,或者你可能需要重写其他function。 如果是这样,这是一个好的开始,并告诉你如何做到这一点…