【问题标题】:MultiSelectListPreference Error inflating class java.lang.reflect.ConstructorMultiSelectListPreference 错误膨胀类 java.lang.reflect.Constructor
【发布时间】:2013-07-01 12:30:02
【问题描述】:

我目前正在尝试在我的设置中实现MultiSelectListPreference,但遇到以下错误:

E/ActivityThread: Failed to inflate
        android.view.InflateException: Binary XML file line #18: Error inflating class java.lang.reflect.Constructor
        at android.preference.GenericInflater.createItem(GenericInflater.java:397)
        at android.preference.GenericInflater.onCreateItem(GenericInflater.java:417)
        at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:428)
        at android.preference.GenericInflater.rInflate(GenericInflater.java:481)
        at android.preference.GenericInflater.inflate(GenericInflater.java:326)
        at android.preference.GenericInflater.inflate(GenericInflater.java:263)
        at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:269)
        at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:285)
        at com.mikebdev.refuel.SettingsActivity$SettingsFragment.onCreate(SettingsActivity.java:34)
        at android.app.Fragment.performCreate(Fragment.java:1673)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:854)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
        at android.app.BackStackRecord.run(BackStackRecord.java:682)
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
        at android.app.Activity.performStart(Activity.java:5113)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2271)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
        at android.app.ActivityThread.access$600(ActivityThread.java:153)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5227)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
        at android.preference.GenericInflater.createItem(GenericInflater.java:383)
        ... 26 more
        Caused by: java.lang.NullPointerException
        at android.content.res.AssetManager.getResourceTextArray(AssetManager.java:230)
        at android.content.res.Resources.getTextArray(Resources.java:427)
        at android.content.res.TypedArray.getTextArray(TypedArray.java:628)
        at android.preference.MultiSelectListPreference.onGetDefaultValue(MultiSelectListPreference.java:211)
        at android.preference.Preference.<init>(Preference.java:267)
        at android.preference.DialogPreference.<init>(DialogPreference.java:69)
        at android.preference.DialogPreference.<init>(DialogPreference.java:90)
        at android.preference.MultiSelectListPreference.<init>(MultiSelectListPreference.java:49)
        ... 29 more

我的 XML 如下所示:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <ListPreference
            android:defaultValue="@string/pref_amountUnit_default"
            android:dialogTitle="@string/pref_amountUnit"
            android:entries="@array/pref_amountUnit_entries"
            android:entryValues="@array/pref_amountUnit_values"
            android:key="pref_amountUnit"
            android:summary="@string/pref_amountUnit_summary"
            android:title="@string/pref_amountUnit"/>
    <ListPreference
            android:defaultValue="@string/pref_distanceUnit_default"
            android:dialogTitle="@string/pref_distanceUnit"
            android:entries="@array/pref_distanceUnit_entries"
            android:entryValues="@array/pref_distanceUnit_values"
            android:key="pref_distanceUnit"
            android:summary="@string/pref_distanceUnit_summary"
            android:title="@string/pref_distanceUnit"/>
    <MultiSelectListPreference
            android:key="pref_consumptionUnit"
            android:title="@string/pref_consumptionUnit"
            android:summary="@string/pref_consumptionUnit_summary"
            android:dialogTitle="@string/pref_consumptionUnit"
            android:entries="@array/pref_consumptionUnit_entries"
            android:entryValues="@array/pref_consumptionUnit_values"
            android:defaultValue="@string/pref_consumptionUnit_default"
            />
    <EditTextPreference
            android:defaultValue="@string/pref_moneyUnit_default"
            android:dialogTitle="@string/pref_moneyUnit"
            android:key="pref_moneyUnit"
            android:summary="@string/pref_moneyUnit_summary"
            android:title="@string/pref_moneyUnit"/>
</PreferenceScreen>

我不知道是什么导致了这个错误。我希望你能指出我正确的方向

【问题讨论】:

    标签: android xml android-preferences multiselectlistpreference


    【解决方案1】:

    在 MultiSelectListPreference 上也有 NPE。 在 API 22 中一切正常,在 API 15 中是 NPE。

    在跟踪和错误之后,触发器是 XML 中的摘要。 以编程方式设置摘要后,没有 NPE。

    看起来像是应用兼容库中的错误?

    【讨论】:

    • 似乎为我解决了这个问题,但显然这是与 OP 不同的问题:在我的情况下,MultiSelectListPreference#onGetDefaultValue() 就在调用堆栈的顶部(就在 NPE 下方),而 OP在 NPE 和onGetDefaultValue() 之间有三个方法调用。看起来确实是一个错误,至少有 17 个 API 受到影响,API 19 很好。
    【解决方案2】:

    好的,我刚刚知道了。

    从我使用ListPreference 开始,我仍在将默认值写入我的SharedPreferences。这显然不适用于 MultiSelectListPreference 想要创建的 Set。

    在尝试获取首选项并为默认值创建 StringSet 时,我刚刚将 getString 更改为 getStringSet

    Set<String> consumptionUnits = new HashSet<String>();
            consumptionUnits.add("l/km");
    consumption_unit = sharedPref.getStringSet("pref_consumptionUnit", consumptionUnits);
    

    【讨论】:

      【解决方案3】:

      您的MultiSelectListPreference 的以下属性似乎导致NullPointerException(在尝试解析String 时?)

      android:defaultValue="@string/pref_consumptionUnit_default"
      

      【讨论】:

      • 我不知道为什么。字符串值是 entryValues 中我的数组项的第一个值
      • 您可能还应该附上您的相关资源。 @mike.b93
      • 我尝试使用字符串而不是字符串引用,但它仍然崩溃。数组不应该是问题,它们在 ListPreference 中工作。@ninetwozero
      • @mike.b93 尝试将数组传递给android:defaultValue。 :-)
      • 没有解决问题。这是尝试数组时出现的新错误java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Set
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2020-07-29
      • 2018-10-02
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多