要在Android偏好中存储整数,我会直观地选择EditTextPreference
并执行通常的String-int-String转换。
但后来我遇到了一段代码,它在<ListPreference>
中存储了一个整数:
<ListPreference
android:key="@string/total_score"
android:defaultValue="0" />
并使用preferences.getInt(getString(R.string.total_score), 0);
这真的有用吗?如果是这样,怎么样?
这被认为是可接受的做法吗?
更新:由于以下答案,我能够找到getInt()的实施源代码。我在这里张贴它是为了方便参考:
jint android::content::SharedPreferences::getInt(local_ref< java::lang::String > const &a0, jint a1)
{
return call_method<
android::content::SharedPreferences::J2CPP_CLASS_NAME,
android::content::SharedPreferences::J2CPP_METHOD_NAME(2),
android::content::SharedPreferences::J2CPP_METHOD_SIGNATURE(2),
jint
>(get_jobject(), a0, a1);
}
答案 0 :(得分:9)
理论上,是的,你可以存储一个ListPreference
的整数。毕竟,它是一个UI首选项,用户将显示的标签/键(android:entries
)映射到内部值(android:entryValues
),并在列表视图中显示所有这些映射选项。内部值也可能是整数。您可以使用<integer-array>
- 资源作为entryValues。
在实践中,我从未见过这项工作 - 它是bugged
当然,您可以在代码中为ListPreference
的首选项键设置一个int值,因为它在内部是正常的首选项。但这会破坏预定义资源数组的整个目的以及从列表中进行选择的能力。作为一种解决方法,如果int数组很方便,我建议使用<string-array>
作为值并在代码中将它们转换为整数,就像使用EditTextPreference
检查this question是否有非工作示例。 ;)
回答您的标题问题选择哪一个整数:取决于。
您可以使用任何一种解决方法。
如果用户应该能够输入任何值(或者只是很多值),那么EditTextPreference
就可以了。 ListPreference
只会太长。
如果您有一小组预定义的整数,请使用ListPreference
。这样使用起来更舒服,可能会显示有用的标签。示例:如果用户应选择时间间隔,则可以在值中映射秒数并显示不同的标签,例如一小时[价值3600;标签“小时”]。
修改:还知道您的代码段可能与哪些内容相关。由于此ListPreference
既未指定android:entries
也未指定android:entryValues
,因此它可能只是默认首选项文件的一部分。您可以将PreferenceManager.setDefaultValues()
与XML文件一起使用来重置/初始化所有首选项键。在这种情况下,您选择的首选项是完全随机的,因为所有计数字段都是android:key
和android:defaultValue
。在这种情况下你可以使用任何其他类型,无所谓。
答案 1 :(得分:1)
我认为正在发生的事情是ListPreference
将条目值存储为字符数组,换句话说是一个字节数组(我从setEntryValues(CharSequence[] entryValues)方法推断出这一点) 。这可能是存储数字的原因,因为值存储在字节数组中,因此使用preferences.getInt(...)
方法仍然有效。然而,这可能是危险的,因为签名可能会出现差异,所以我不推荐它,而是从字符串首选项解析int。