По умолчанию bindPreferenceSummaryToValue сбой для нестроковых типов

Я следую примеру метода, чтобы добавить диалог совместимых настроек/фрагментов, найденный здесь. При этом я обнаружил, что если у меня есть предпочтения, которые являются целыми, Boolean и т.д., Он просто падает.

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(),""));
}

Я обнаружил, что могу выполнить эту работу для Integer, изменив getString() на getInteger() и используя другую функцию bindPreferenceSummaryToValue в зависимости от типа. Конечно, это похоже на действительно неэлегантное решение, но я изо всех сил пытаюсь понять, что еще я могу сделать. Здесь трассировка стека, 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)

Ответ 1

Нет чистого решения, которое я могу найти, но наилучшим обходным решением кажется что-то вроде этого, используя instanceof, чтобы выяснить, с какими типами данных вы имеете дело.

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));
    }
}

Ответ 2

private static void bindPreferenceSummaryToValue(Preference preference) {
//Todo
}

этот метод используется для отображения текущего значения ваших предпочтений, например, если вы используете <SwitchPreference/>, который имеет значение как true или false он отобразит это значение в резюме. Вам не нужно показывать логические значения в виде сводки. Этот метод используется для <ListPreference/> или <RingtonePreference/> где вы хотите увидеть текущее значение. Резюме в этом случае - строка, но для <SwitchPreference/> она имеет значение boolean. Либо вы можете игнорировать это логическое резюме, либо можете использовать instanceof, вы можете избежать исключения.