Standard bindPreferenceSummaryToValue Abstürze für nicht-string-Typen
Ich bin nach dem Beispiel-Methode zum hinzufügen einer kompatiblen Präferenz/fragment dialog gefunden hier. Dabei habe ich festgestellt, dass wenn ich Einstellungen, die sind Integer, Boolean, etc, es einfach abstürzt.
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(),""));
}
Fand ich, dass ich diese Arbeit machen für eine ganze Zahl durch änderung der getString()
zu getInteger()
, und mit einem anderen bindPreferenceSummaryToValue Funktion je nachdem, auf was der Typ ist. Natürlich, dies scheint wie ein wirklich unelegant Lösung, aber ich bin kämpfen, um herauszufinden, was ich tun kann. Hier ist der 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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nicht eine saubere Lösung, die ich finden kann, aber die beste Problemumgehung zu sein scheint, so etwas wie dieses, mit
instanceof
um herauszufinden, welche Art von Daten Sie es zu tun haben.diese Methode ist für die Anzeige den aktuellen Wert Ihrer Präferenz,
e.g Wenn Sie ' r mit
<SwitchPreference/>
welchen Wert hat alstrue
oderfalse
es zeigt sich, dass der Wert in der Zusammenfassung.
Sie brauchen nicht zu zeigen, Boolesche Werte als Zusammenfassung.
Diese Methode wird verwendet, für
<ListPreference/>
oder<RingtonePreference/>
wo Sie sehen möchten der aktuelle Wert angezeigt. Zusammenfassung in diesem Fall ist string aber für
<SwitchPreference/>
es ist boolean. Entweder Sie ignorieren diese boolean Zusammenfassung oder kann mit derinstanceof
können Sie vermeiden, Ausnahme.