【问题标题】:Why, in androidx settings/preferences, am I getting "java.lang.String cannot be cast to java.lang.Integer" exception?为什么在 androidx 设置/首选项中出现“java.lang.String 无法转换为 java.lang.Integer”异常?
【发布时间】:2023-01-22 10:45:10
【问题描述】:

在我的 preferences.xml 中我有这个:

        <ListPreference
           app:dependency="@string/auto_record_key"
           app:defaultValue="3"
           app:dialogTitle="@string/track_step_distance_dialog_title"
           app:entries="@array/track_step_distance_entries"
           app:entryValues="@array/track_step_distance_values"
           app:key="@string/track_step_distance_key"
           app:summary="@string/track_step_distance_summary"
           app:title="@string/track_step_distance_title" />

使用这些数组:

        <item>off (time only)</item>
        <item>5</item>
        <item>10</item>
        <item>15</item>
        <item>20</item>
        <item>30</item>
        <item>50</item>
        <item>100</item>
        <item>200</item>
        <item>300</item>
    </string-array>

    <string-array name="track_step_distance_values">
        <item>0</item>
        <item>5</item>
        <item>10</item>
        <item>15</item>
        <item>20</item>
        <item>30</item>
        <item>50</item>
        <item>100</item>
        <item>200</item>
        <item>300</item>
    </string-array>

在我的 onSharedPreferenceChanged 中:

        keyString = mContext.getString(R.string.track_step_distance_key );
        if (  key == null || key.equals( keyString )  ) {
        int trackStepDistance = preferences.getInt( keyString, 3 ); 
        }

每当此 onSharedPreferenceChanged 代码运行时, 它得到这个例外:

        java.lang.RuntimeException: Unable to start activity ComponentInfo{dkr.ajijic.apps.tracks/dkr.ajijic.apps.tracks.MySettingsActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

为什么?

【问题讨论】:

    标签: sharedpreferences androidx android-preferences


    【解决方案1】:

    你的

         int trackStepDistance = preferences.getInt( keyString, 3 );
    

    得到异常是因为首选项库做了一些欺骗性的事情。 您合理地假设数组:

            <string-array name="track_step_distance_values">
            <item>0</item>
            <item>5</item>
            <item>10</item>
            <item>15</item>
            <item>20</item>
            <item>30</item>
            <item>50</item>
            <item>100</item>
            <item>200</item>
            <item>300</item>
        </string-array>
    

    告诉库将整数发送到 sharedPreferences 文件。 但是图书馆不这样做;它发送字符串。 所以,getInt 试图从字符串中获取一个整数, 这会导致异常。 修复?

        int trackStepDistance = Integer.parseInt(preferences.getString( keyString, "6" ));
    

    现在我们正确地获取了字符串,然后将其解析为整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多