Android:无法使用 SharedPreferences getInt 从首选项中读取整数值

问题描述 投票:0回答:1

在我的 AppSettings 类中,我有一个注释类,用于存储首选项默认值,如下所示(我使用“Any”,因此可以使用 Lateinit):

annotation class PrefDefValues {
    companion object {
        lateinit var TestTime: Any
        ...
    }
}

在我的应用程序启动中,我读取了所有首选项默认值,如下所示:

private fun readDefaultValues(){
    PrefDefValues.TestTime = resources.getInteger(R.integer.pref_testtime_default)
    ...
}

这是我的 xml 默认值资源文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="pref_testtime_default">5</integer>
    ...
</resources>

在我的一堂课上,我尝试按以下方式阅读偏好:

val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
val timerPreference = sharedPref.getInt(TMSettings.TESTTIME.key, PrefDefValues.TestTime as Int)

但是它崩溃了

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

我被困住了,我不明白它为什么抱怨。 PrefDefValues.TestTime 返回一个整数,而不是字符串,并且在sharedPrefs中我使用方法getInt,所以首先它们都匹配。

如果我这样做:

val timerPreference = sharedPref.getString(TMSettings.TESTTIME.key, PrefDefValues.TestTime.toString())!!.toInt()

然后它工作得很好,但我发现必须转换为字符串然后再次转换为 int 是荒谬的(然后我需要的是一个整数。

编辑1:额外信息

这是我的偏好.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto">
    <PreferenceCategory
        android:key="pref_category_test"
        android:title="@string/pref_category_test"
        app:iconSpaceReserved="false">
        <ListPreference
            android:key="pref_testtime"
            android:title="@string/pref_testtime"
            android:entries="@array/testtime_texts"
            android:entryValues="@array/testtime_values"
            android:defaultValue="@integer/pref_testtime_default"
            app:iconSpaceReserved="false" />
        ...
</PreferenceScreen>
android kotlin exception casting sharedpreferences
1个回答
1
投票

好的,@Ivo 为我指明了正确的方向(谢谢)。

如果您看到我的preferences.xml(发布在我的问题中),您会注意到我从数组中读取了值。

这是我存储值的数组文件中的相关部分:

<string-array name="testtime_values">
    <item>1</item>
    <item>2</item>
    <item>3</item>
    <item>5</item>
    <item>-1</item>
</string-array>

我目前正在使用 string-array,但是在我更改为 integer-array 后,一切都开始按预期工作。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.