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

我在共享首选项中创建列表,当调用onPreferenceChanged()方法时,我想在列表中提取项目的索引,或者在某些情况下提取整数值。 我正在尝试构建xml数据,如下所示:

在数组中:

 Dark Background Light Background   1 0   Slow Medium Fast   1 4 16  

在首选项xml文件中:

     

所以我的xml不起作用。 我知道如何使用字符串数组而不是数组来表示值。 我可以提取值字符串并从中得到我想要的但我宁愿(如果可能的话)能够得到值为int,booleans或enums的列表。 这样做的习惯方法是什么?

提前致谢,

松鸦

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

将首选项放在String并使用Integer.parseInt() 。 我认为实际上有关于您所指的限制的错误报告,但我找不到链接。 根据经验,我可以告诉你只需使用Strings并为自己节省很多挫折感。

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

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

它仍然被评论,但没有变化(无论如何2.3.3)。

.valueOf()的Integer.parseInt()必须工作。 如果valueOf()正常工作,请使用它,因为它不像parseInt()那样分配,当你需要像我一样避免使用GC时很有帮助。

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

  

在strings.xml中

 Number of logs per cache  10 20 50 Give me all!   10 20 50 -1  

这是我使用的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(); } } } 

我正在使用它通过代码创建ListPreferences值,只需尝试一下。 它可能会立即工作,或者您可能需要覆盖其他function。 如果是这样,这是一个良好的开端,并向您展示如何做到这一点……