Default bindPreferenceSummaryToValue se bloque pour les types non-string

Je suis en train de suivre la méthode d'exemple pour ajouter une boîte de dialogue de préférence / fragment compatible trouvée ici . Ce faisant, j'ai constaté que si j'ai des préférences qui sont Integers, Boolean, etc., il se bloque.

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

J'ai trouvé que je peux faire fonctionner cela pour un entier en changeant getString() pour getInteger() et en utilisant une fonction bindPreferenceSummaryToValue différente en fonction de ce que le type est. Bien sûr, cela semble être une solution vraiment inelegante, mais j'ai du mal à comprendre ce que je peux faire. Voici la trace de la pile, BTW.

  • Gradient radial en XML avec taille parentale
  • Google Play Game Services Le changement d'orientation des périphériques multi-joueurs déclenche l'utilisateur hors de la pièce
  • L'utilisation du modèle de repos au printemps provoque EOFException
  • FloatingActionButton in Fragment caché sur la barre d'outils s'effondrant
  • Les threads d'application vs les threads de service
  • Comment remplacer une chaîne pour un buildvariant avec gradle dans un studio Android?
  •  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) 

  • Modifiez la taille d'étape d'un NumberPicker
  • Comment afficher une vue pendant 3 secondes, puis la cacher?
  • Comment publier une grande vidéo sur un serveur, dans Android?
  • Comment puis-je ajouter un spinner à la barre de titre d'une activité?
  • ExoPlayer - jouez 10 fichiers l'un après l'autre
  • Android HttpClient - le nom d'hôte dans le certificat n'a pas correspondu <example.com>! = <*. Example.com>
  • 2 Solutions collect form web for “Default bindPreferenceSummaryToValue se bloque pour les types non-string”

    Il n'y a pas une solution propre que je peux trouver, mais la meilleure solution semble être quelque chose comme ça, en utilisant instanceof pour déterminer quel type de données vous rencontrez.

     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)); } } 
     private static void bindPreferenceSummaryToValue(Preference preference) { //Todo } 

    Cette méthode est utilisée pour afficher la valeur actuelle de votre préférence, par exemple, si vous utilisez <SwitchPreference/> qui a une valeur comme true ou false elle affichera cette valeur en résumé. Vous n'avez pas besoin de montrer les valeurs booléennes en tant que résumé. Cette méthode est utilisée pour <ListPreference/> ou <RingtonePreference/> où vous souhaitez voir la valeur actuelle. Le résumé dans ce cas est une chaîne mais pour <SwitchPreference/> c'est boolean. Soit vous pouvez ignorer ce résumé booléen ou peut utiliser l' instanceof vous pouvez éviter une exception.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.