SharedPreferences.getInt() 会导致 ClassCastException - 为什么?
我在首选项 XML 中定义了一个简单的(用户不可编辑的)数字设置,如下所示:
<EditTextPreference
android:key="@string/numeric_val"
android:defaultValue="0" />
我使用这个简单的语句读取它:
sharedPrefs.getInt(getString(R.string.numeric_val), 3)
它可以工作,但是当我尝试读取它时,在应用程序安装后第一次读取它,它会生成一个ClassCastException
。
文档说getInt()
“如果此名称的首选项不是 int,则抛出 ClassCastException。” - 而且我知道此首选项被明确定义为
(字符串?)但是,如果这是异常的原因,我应该如何使用 SharedPreferences.getInt()
?
我知道我可以使用 SharedPreferences.getString() 代替,然后自己进行解析/转换,但是 SharedPreferences.getInt() 的目的是什么?
I have a simple (not user-editable) numerical setting defined in a preferences XML as follows:
<EditTextPreference
android:key="@string/numeric_val"
android:defaultValue="0" />
And I read it using this simple statement:
sharedPrefs.getInt(getString(R.string.numeric_val), 3)
It works, but when I try to read it, for the first time after application install, it generates a ClassCastException
.
The documentation says that getInt()
"Throws ClassCastException if there is a preference with this name that is not an int." - and I know that this preference is clearly defined as an <EditTextPreference>
(a string?) but, if this is the reason for the exception, how I am supposed to use SharedPreferences.getInt()
?
I know I can use SharedPreferences.getString()
instead and then do the parsing/conversion myself, but then what is the purpose of SharedPreferences.getInt()
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以将首选项存储为
sharedPreferences.edit().putInt(..).commit()
(作为示例);然后将它们作为 getInt 获取。但如果您使用 EditTextPreference 它会将首选项的类型设置为字符串。因此,如果您使用 EditTextPreference 存储一些数据,请使用 Integer.valueOf(getString) 来取回它。
如果您手动放置,请使用
getInt()
。作为解决方法,您可以在此 EditTextPreference 上设置
onPreferenceChangeListener
,每当用户更改它时,您将手动将其保存为 int,这样 getInt 就会正常工作。You can store preferences as
sharedPreferences.edit().putInt(..).commit()
(as an example);And then get them as getInt. But if you use EditTextPreference it will set the type of the preference to string. So if you use EditTextPreference to store some data, use
Integer.valueOf(getString)
to get it back.If, you put it manually, use
getInt()
.As a workaround, you can set
onPreferenceChangeListener
on this EditTextPreference , and whenever user changes it, you will manually save it as an int, so then, getInt will work normally.是一个字符串。
无法在首选项的 xml 中声明实际的 int
is a string.
There is no way to declare an actual int in the xml of your prefs