Modification de la couleur du diviseur NumberPicker

Sur les versions Android récentes, les sélecteurs de numéros utilisent un diviseur bleu lorsqu'il est dessiné (voir image ci-dessous).

Entrez la description de l'image ici

  • Le code anglais US modifié a-t-il changé? Google Speech Api v2 ne renvoie pas le bon résultat
  • Android, classe non trouvée à partir du fichier jar importé
  • Pourquoi Eclipse ajoute-t-il automatiquement le support de bibliothèque appcompat v7 chaque fois que je crée un nouveau projet?
  • RxJava et données mises en cache
  • Pourquoi utiliser getCacheDir () sur Android
  • Copiez plusieurs fichiers txt dans / system using Android.mk
  • Je voudrais changer cette couleur. Existe-t-il une solution de travail? Ou peut-être une bibliothèque qui regroupe une version mise à jour de NumberPicker qui permet de personnaliser la couleur du diviseur?

    J'ai essayé android-numberpicker mais j'ai une erreur (voir ci-dessous) en cours d'exécution en raison d'un code de la bibliothèque qui essaie d'accéder à un identifiant de ressource qui n'existe pas.

    android.content.res.Resources$NotFoundException: Resource ID #0x0 at android.content.res.Resources.getValue(Resources.java:1123) at android.content.res.Resources.loadXmlResourceParser(Resources.java:2309) at android.content.res.Resources.getLayout(Resources.java:939) at android.view.LayoutInflater.inflate(LayoutInflater.java:395) at net.simonvt.numberpicker.NumberPicker.<init>(NumberPicker.java:635) at net.simonvt.numberpicker.NumberPicker.<init>(NumberPicker.java:560) at net.simonvt.numberpicker.NumberPicker.<init>(NumberPicker.java:550) 

  • Samsung Galaxy / Holoeverywhere - La ressource n'est pas une ColorStateList (couleur ou chemin)
  • Infermer la nullité s'exécute pour toujours
  • RecyclerView Endless Infinite Scrolling Issue
  • Android / java Sqlite: Comment récupérer le délai de date maximum?
  • Masquer le clavier doux à la touche de retour, appuyez sur
  • N'a pas trouvé de classe "android.support.multidex.MultiDexApplication" sur le chemin d'accès: DexPathList
  • 10 Solutions collect form web for “Modification de la couleur du diviseur NumberPicker”

    Basé sur ceci ( https://stackoverflow.com/a/20291416/2915480 bien qu'il s'agisse de DatePicker) il existe plusieurs façons:

    1. Écrivez votre propre NumberPicker sans mSelectionDivider et ses sociétés affiliées ou utilisez le backported par Vikram . Dans le dernier cas:

      1. Télécharger à partir de lib de github
      2. Changement dessiné en res / drawable-xxx / np_numberpicker_selection_divider.9.png:

        • À transparent (ou quoi que ce soit) .9.png
        • Créez np_numberpicker_selection_divider.xml ressource de ligne de forme en res / drawable (avec hauteur 0dp ou couleur transparente).
      3. OU supprimez if (mSelectionDivider != null) se ramifie de la méthode OnDraw (Canvas) dans NumberPicker.java comme ici

    2. Utilisez la réflexion pour accéder au private final field mSelectionDivider (détails: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/NumberPicker.java ) – p. Ex. Voir la modification ici . J'ai utilisé la réflexion, mais ce n'est pas la meilleure solution.

    Si vous voulez simplement changer la couleur (en fonction de la réponse stannums):

     private void setDividerColor(NumberPicker picker, int color) { java.lang.reflect.Field[] pickerFields = NumberPicker.class.getDeclaredFields(); for (java.lang.reflect.Field pf : pickerFields) { if (pf.getName().equals("mSelectionDivider")) { pf.setAccessible(true); try { ColorDrawable colorDrawable = new ColorDrawable(color); pf.set(picker, colorDrawable); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (Resources.NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } } 

    Et après ça

     setDividerColor(mNumberPicker, Color.GREEN); 

    J'utilise la méthode de contournement

      private void setDividerColor (NumberPicker picker) { java.lang.reflect.Field[] pickerFields = NumberPicker.class.getDeclaredFields(); for (java.lang.reflect.Field pf : pickerFields) { if (pf.getName().equals("mSelectionDivider")) { pf.setAccessible(true); try { //pf.set(picker, getResources().getColor(R.color.my_orange)); //Log.v(TAG,"here"); pf.set(picker, getResources().getDrawable(R.drawable.dot_orange)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } //} } 

    Et appliquez ses

      setDividerColor(yourNumberPicker); 

    Je suis assez nouveau sur Android, alors gardez à l'esprit que cette solution peut ne pas être une bonne pratique, mais j'ai trouvé un moyen (hacking) d'obtenir cet effet en utilisant uniquement XML / SANS réflexion.

    J'ai pu «changer» les couleurs des diviseurs sur mes NumberPickers dans un LinearLayout en ajoutant 2 vues horizontales minces au ViewGroup et en leur donnant des marges de mise en page négatives et ma couleur désirée pour leur arrière-plan:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_gravity="center_horizontal" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" > <NumberPicker android:layout_width="70dip" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:layout_gravity="center" android:layout_margin="5dp" /> <View android:layout_height="2dp" android:layout_width="70dp" android:background="@color/myColor" android:layout_gravity="center_vertical" android:layout_marginLeft="-75dp" android:layout_marginBottom="-25dp"> </View> <View android:layout_height="2dp" android:layout_width="70dp" android:background="@color/myColor" android:layout_gravity="center_vertical" android:layout_marginLeft="-70dp" android:layout_marginBottom="25dp"> </View> </LinearLayout> 

    Certes, je ne modifie pas vraiment la couleur, mais j'ajoute de nouvelles lignes avec la couleur désirée sur les diviseurs intégrés. Espérons que cela aide quelqu'un de toute façon!

    Vous devrez peut-être jouer avec les marges, mais ces paramètres étaient parfaits pour mes dialogues personnalisés.

    Cela a fonctionné pour moi sans utiliser le reflet.

    My_layout.xml

     <NumberPicker ... android:theme="@style/DefaultNumberPickerTheme" /> 

    Styles.xml (AppTheme est le thème de mon application dans l'application)

     <style name="DefaultNumberPickerTheme" parent="AppTheme"> <item name="colorControlNormal">@color/dividerColor</item> </style> 

    J'utilise le code ci-dessous pour changer le diviseur, pas directement la couleur, mais vous pouvez le faire avec un png comme celui-ci .

    Cette solution que je vous apporte vient d' ici , mais mon code est une simplification facile pour changer le diviseur et c'est tout.

      // change divider java.lang.reflect.Field[] pickerFields = NumberPicker.class .getDeclaredFields(); for (java.lang.reflect.Field pf : pickerFields) { if (pf.getName().equals("mSelectionDivider")) { pf.setAccessible(true); try { pf.set(spindle, getResources().getDrawable(R.drawable.np_numberpicker_selection_divider_green)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } 

    Vous pouvez utiliser la réflexion pour faire l'affaire. Voici ma solution

     public class ColorChangableNumberPicker extends NumberPicker { public ColorChangableNumberPicker(Context context) { super(context); init(); } public ColorChangableNumberPicker(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ColorChangableNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ColorChangableNumberPicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init() { setDividerColor(Color.RED); } public void setDividerColor(@ColorInt int color) { try { Field fDividerDrawable = NumberPicker.class.getDeclaredField("mSelectionDivider"); fDividerDrawable.setAccessible(true); Drawable d = (Drawable) fDividerDrawable.get(this); d.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); d.invalidateSelf(); postInvalidate(); // Drawable is dirty } catch (Exception e) { } } } 

    En utilisant ce code pour tout ce que vous voulez faire avec le diviseur

     Field[] pickerFields = NumberPicker.class.getDeclaredFields(); for (Field pf : pickerFields) { if (pf.getName().equals("mSelectionDivider")) { pf.setAccessible(true); try { pf.set(picker, getResources().getDrawable(R.drawable.divider)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } 

    Il est préférable de stocker un champ privé si vous modifiez la couleur du diviseur à l'avenir. Comme ça:

     @Nullable private Field dividerField; public void setDivider(@Nullable Drawable divider) { try { if (dividerField == null) { dividerField = NumberPicker.class.getDeclaredField("mSelectionDivider"); dividerField.setAccessible(true); } dividerField.set(this, divider); } catch (Exception ignore) {} } 

    Le moyen le plus simple est d'ajouter cet attribut dans votre sélecteur NumberPicker dans xml

     android:selectionDivider="@colors/your_color" 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.