在我的 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>
好的,@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 后,一切都开始按预期工作。