web-dev-qa-db-fra.com

comment changer le style de sélecteur de numéro dans Android?

Je souhaite utiliser le composant composant widget NumberPicker, mais dans le thème par défaut d'Holo, je dois remplacer la couleur bleue par l'orange, cette couleur étant celle par défaut dans mon style .. numéros, et garder toutes les fonctionnalités du composant? the default number picker in HoloMerci

14
user1796624

Créez une copie de bibliothèque/res/drawable - */numberpicker_selection_divider.9.png et nommez-la, par exemple custom_np_sd.9.png.

Remplacer le style NumberPicker par défaut via le thème d'activité:

<style name="AppTheme" parent="@style/Holo.Theme">
  <item name="numberPickerStyle">@style/CustomNPStyle</item>
</style>
<style name="CustomNPStyle" parent="@style/Holo.NumberPicker">
  <item name="selectionDivider">@drawable/custom_np_sd</item>
</style>

Et appliquez @ style/AppTheme comme thème d'activité.

0
Prototik

Malheureusement, vous ne pouvez pas le nommer. Les styles et les attributs de style pour NumberPicker ne sont pas présents dans l'API publique. Par conséquent, vous ne pouvez pas les définir et modifier l'aspect par défaut. Vous pouvez uniquement choisir entre les thèmes clair et sombre.

En guise de solution, je suggérerais d'utiliser Android-numberpicker library à la place. La bibliothèque est essentiellement un port de NumberPicker extrait des codes sources Android. Mais c’est mieux que cela, il permet également de reporter NumberPicker sur Android 2.x. La bibliothèque peut être facilement stylée. 

Pour styler le séparateur, ajustez le style NPWidget.Holo.NumberPicker et ses attributs selectionDivider et selectionDividerHeight
Pour styler le texte, ajustez le style NPWidget.Holo.EditText.NumberPickerInputText.

23
Tomik

 enter image description here

<NumberPicker
        Android:id="@+id/np"
        Android:layout_width="40dp"
        Android:layout_height="40dp"
        Android:layout_centerHorizontal="true"
        Android:background="@drawable/drawablenp"


        Android:layout_centerVertical="true"></NumberPicker>

Créer un fond dans un dossier pouvant être dessiné

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle">
    <gradient
        Android:startColor="#707070"
        Android:centerColor="#f8f8f8"
        Android:endColor="#707070"
        Android:angle="270"/>
</shape>
8
Antony jackson

Je fais aussi face à ce problème, je me sers de Reflect pour changer de style

public class MyNumberPicker extends NumberPicker {
    public MyNumberPicker(Context context) {
        super(context);

        setNumberPickerDivider();
    }

    public MyNumberPicker(Context context, AttributeSet attrs) {
        super(context, attrs);

        setNumberPickerDivider();
    }

    public MyNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        setNumberPickerDivider();
    }

    @RequiresApi(api = Build.VERSION_CODES.Lollipop)
    public MyNumberPicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        setNumberPickerDivider();
    }

    @Override
    public void addView(View child) {
        super.addView(child);
        updateView(child);
    }

    @Override
    public void addView(View child, int index, Android.view.ViewGroup.LayoutParams params) {
        super.addView(child, index, params);
        updateView(child);
    }

    @Override
    public void addView(View child, Android.view.ViewGroup.LayoutParams params) {
        super.addView(child, params);
        updateView(child);
    }

    public void updateView(View view) {
        if (view instanceof EditText) {
            EditText et = (EditText) view;
            et.setTextColor(ContextCompat.getColor(getContext(), R.color.font_content));
            et.setTextSize(16);
        }
    }

    private void setNumberPickerDivider() {

        try {
            {
                Field field = NumberPicker.class.getDeclaredField("mSelectionDivider");
                field.setAccessible(true);
                field.set(this, ContextCompat.getDrawable(getContext(), R.drawable.horizontal_divider));
            }

            {
                Field field = NumberPicker.class.getDeclaredField("mSelectionDividerHeight");
                field.setAccessible(true);
                field.set(this, 1);
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
1
aotian16