非字符串类型的默认bindPreferenceSummaryToValue崩溃 [英] Default bindPreferenceSummaryToValue crashes for non-string types

查看:83
本文介绍了非字符串类型的默认bindPreferenceSummaryToValue崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在按照示例方法添加在在此处找到的兼容首选项/片段对话框.这样做时,我发现如果我的偏好设置为整数,布尔值等,它会崩溃.

I'm following the example method to add a compatible preference/ fragment dialog found here. When doing so, I have found that if I have preferences that are Integers, Boolean, etc, it just crashes.

private static void bindPreferenceSummaryToValue(Preference preference) {
    // Set the listener to watch for value changes.
    preference
            .setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    // Trigger the listener immediately with the preference's
    // current value.
    sBindPreferenceSummaryToValueListener.onPreferenceChange(
            preference,
            PreferenceManager.getDefaultSharedPreferences(
                    preference.getContext()).getString(preference.getKey(),""));
}

我发现我可以通过将getString()更改为getInteger(),并根据类型使用不同的bindPreferenceSummaryToValue函数来使此功能适用于Integer.当然,这似乎是一个非常微不足道的解决方案,但是我正在努力弄清楚我还能做些什么.这是堆栈跟踪,顺便说一句.

I found that I can make this work for an Integer by changing the getString() to getInteger(), and using a different bindPreferenceSummaryToValue function depending on what the type is. Of course, this seems like a really inelegant solution, but I'm struggling to figure out what else I can do. Here's the stack trace, BTW.

11-22 19:52:10.068: E/AndroidRuntime(17564): FATAL EXCEPTION: main
11-22 19:52:10.068: E/AndroidRuntime(17564): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kd7uiy.hamfinder/com.kd7uiy.hamfinder.MainSettingsActivity}: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.os.Looper.loop(Looper.java:137)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.app.ActivityThread.main(ActivityThread.java:5103)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at java.lang.reflect.Method.invokeNative(Native Method)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at java.lang.reflect.Method.invoke(Method.java:525)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at dalvik.system.NativeStart.main(Native Method)
11-22 19:52:10.068: E/AndroidRuntime(17564): Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
11-22 19:52:10.068: E/AndroidRuntime(17564):    at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:224)
11-22 19:52:10.068: E/AndroidRuntime(17564):    at com.kd7uiy.hamfinder.MainSettingsActivity.bindPreferenceSummaryToValue(MainSettingsActivity.java:194)

推荐答案

我找不到一个干净的解决方案,但是最好的解决方法似乎是这样的,使用instanceof来找出哪种类型的解决方案.您正在处理的数据.

There isn't a clean solution that I can find, but the best workaround seems to be something like this, using instanceof to figure out what type of data you are dealing with.

private static void bindPreferenceSummaryToValue(Preference preference) {
    // Set the listener to watch for value changes.
    preference
            .setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);


    if (preference instanceof SeekBarPreference)
    {
        // Trigger the listener immediately with the preference's
        // current value.
        sBindPreferenceSummaryToValueListener.onPreferenceChange(
                preference,
                PreferenceManager.getDefaultSharedPreferences(
                        preference.getContext()).getInt(preference.getKey(),0));
    }
    else if (preference instanceof CheckBoxPreference)
    {
        // Trigger the listener immediately with the preference's
        // current value.
        sBindPreferenceSummaryToValueListener.onPreferenceChange(
                preference,
                PreferenceManager.getDefaultSharedPreferences(
                        preference.getContext()).getBoolean(preference.getKey(),true));
    }
}

这篇关于非字符串类型的默认bindPreferenceSummaryToValue崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆