addPreferencesFromResource导致ClassCastException

时间:2014-05-15 02:33:54

标签: android android-fragments sharedpreferences classcastexception

我将共享偏好设置填充到PreferenceFragment,作为ActionBar中的标签提供。首选项填充在片段的onCreate方法

public static class WIKPreferenceFragment extends PreferenceFragment
{
    @Override
    public void onCreate ( Bundle bundle )
    {
        super.onCreate( bundle );
        this.addPreferencesFromResource( R.layout.settings_fragment );
    }
}

选择标签后,会直接添加PreferenceFragment

public void onTabSelected ( Tab tab, FragmentTransaction transaction )
{
    transaction.replace( R.id.tab_view_target, new WIKPreferenceFragment() );
    ( (WIKActivity) this.activity ).setTabMemory( tab.getPosition() );
}

R.layout.settings_fragment的内容是

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent" >
    <PreferenceCategory android:title="@string/category_proximity_settings" >
        <CheckBoxPreference
            android:key="@+key/USE_PASSIVE_GPS"
            android:summary="@string/summary_use_passive_gps"
            android:title="@string/title_use_passive_gps" />
        <EditTextPreference
            android:inputType="number"
            android:key="@+key/GPS_TIMEOUT"
            android:summary="@string/summary_gps_timeout"
            android:title="@string/title_gps_timeout" />
    </PreferenceCategory>
</PreferenceScreen>

使用全新安装,首选项选项卡时,首选项片段会正确显示如果选择了另一个选项卡并返回此选项卡,则会出现以下错误:

05-14 19:23:02.366: E/AndroidRuntime(11744): FATAL EXCEPTION: main
05-14 19:23:02.366: E/AndroidRuntime(11744): Process: org.eightbeers.android.wik, PID: 11744
05-14 19:23:02.366: E/AndroidRuntime(11744): java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:224)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.Preference.getPersistedString(Preference.java:1429)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.EditTextPreference.onSetInitialValue(EditTextPreference.java:154)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.Preference.dispatchSetInitialValue(Preference.java:1345)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.Preference.onAttachedToHierarchy(Preference.java:1140)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:163)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:104)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:45)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.GenericInflater.rInflate(GenericInflater.java:488)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.GenericInflater.rInflate(GenericInflater.java:493)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.GenericInflater.inflate(GenericInflater.java:326)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.GenericInflater.inflate(GenericInflater.java:263)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:272)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:285)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at org.eightbeers.android.wik.activity.SettingsTab$WIKPreferenceFragment.onCreate(SettingsTab.java:27)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.Fragment.performCreate(Fragment.java:1688)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:860)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1063)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.BackStackRecord.run(BackStackRecord.java:684)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1450)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:444)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.os.Handler.handleCallback(Handler.java:733)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.os.Handler.dispatchMessage(Handler.java:95)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.os.Looper.loop(Looper.java:136)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at android.app.ActivityThread.main(ActivityThread.java:5105)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at java.lang.reflect.Method.invokeNative(Native Method)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at java.lang.reflect.Method.invoke(Method.java:515)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
05-14 19:23:02.366: E/AndroidRuntime(11744):    at dalvik.system.NativeStart.main(Native Method)

一些可能有用的数据点:

  • CheckBoxPreference被注释掉,或者EditTextPreference被注释掉时(例如,如果只有一个首选项,一切正常;当然,我希望有一个以上,甚至两个以上的

  • 如果首选项未在onCreate中重新加载(如果已加载),则不会发生此错误;但是,如果更改了此选项,则重新选择选项卡时不会显示任何首选项

  • 此错误通过清除用户数据,重新启动Eclipse,卸载应用程序,项目清理和手机重新启动(好吧,只有一个)而持续存在;除了手机重启(因为我只尝试过一次),它通过以前的任何组合持续存在

  • 为了简化卸载,我将应用从WIK重命名为AAWIK;但是,在设置 - &gt;应用程序管理器窗口应用程序仍按字母顺序排列为WIK。 UI中的其他任何地方--- app抽屉,卸载窗格,通知等---这是AAWIK;这可能只是一个极端的缓存问题? (编辑:这最后一个问题只是通过让手机闲置,足够长时间让我输入这个问题来解决;不再是有用的数据点,所有其他问题仍然存在。)

3 个答案:

答案 0 :(得分:1)

通过在android:key="@+key/[keyname]"的XML中切换android:key="[keyname]"来解决问题。

我不打算立即接受我的回答,因为我不知道为什么这样做有效,谷歌还没有出现。

答案 1 :(得分:0)

密钥应存储为prefs.xml中的字符串(如果需要,还可以存储为其他名称)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="pref_key_gps" translatable="false">pref_key_gps</string>
</resources>

你应该替换:

android:key="@+key/USE_PASSIVE_GPS"

为:

android:key="@string/pref_key_gps"

答案 2 :(得分:0)

中文

现在碰到的问题是,addPreferencesFromResource ClassCastException Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

我所使用到的控件<EditTextPreference .../>

我的业务场景:

  1. 通过EditTextPreference处理的数据都是数字。
  2. 首次将数据写入xml文件的工作不是通过EditTextPreference完成的;我是手动完成的,使用的方法是putInt
  3. 在加载包含EditTextPreference布局的时候报错。

错误原因,在EditTextPreference类内部所维护的数据是通过putStringgetString来维护的。 所以我只需要将手动部分设置成putString即可解决问题。

英语

我的问题是:addPreferencesFromResource ClassCastException Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

我正在使用的小部件是:<EditTextPreference .../>

我的业务场景是:

  1. EditTextPreference仅包含数字。
  2. 我第一次通过xml将数据写入SharedPerference.Editro.putInt()文件,而不是通过`EditTextPreference'完成。
  3. 加载EditTextPreference布局时应用折衷。

问题的原因是:

  • EditTextPreference类中,数据由putStringgetString维护。但是我使用的是putInt
  • 因此将putInt更改为putString可以解决问题