Как изменить стиль выбора номера в Android?

Я хочу использовать компонент-виджет NumberPicker, но вместо этого в теме Holo по умолчанию мне нужно заменить синий цвет на оранжевый, так как это стиль по умолчанию в моем стиле. Как я могу заменить синий цвет и цвет чисел и сохранить все функциональные возможности компонента?Выбор номера по умолчанию в ХолоСпасибо

4 ответа

Решение

Сделайте копию библиотеки /res/drawable-*/numberpicker_selection_divider.9.png и назовите ее, например, custom_np_sd.9.png.

Переопределить стиль NumberPicker по умолчанию через тему активности:

<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>

И примените @style/AppTheme в качестве темы деятельности.

К сожалению, вы не можете это стилизовать. Стили и атрибуты стиля для NumberPicker отсутствуют в общедоступном API, поэтому вы не можете установить их и изменить внешний вид по умолчанию. Вы можете выбрать только между светлой и темной темой.

В качестве решения я бы предложил использовать библиотеку https://github.com/SimonVT/android-numberpicker. Библиотека представляет собой порт NumberPicker, извлеченный из исходных кодов Android. Но это лучше, чем это, это также backports NumberPicker на Android 2.x. Библиотека может быть легко оформлена.

Чтобы стиль разделителя настроить NPWidget.Holo.NumberPicker стиль и его selectionDivider а также selectionDividerHeight атрибутов.
Чтобы стиль текста настроить NPWidget.Holo.EditText.NumberPickerInputText стиль.

введите описание изображения здесь

<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>

Создать фон в папке для рисования

<?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>

Я тоже столкнулся с этой проблемой. Я очень хочу иметь хороший NumberPicker UI. Все ответы в этом вопросе работали, но очень ограничены. Я почти создаю свой собственный RecylerView создать NumberPicker Я хочу. Видимо, я нашел аккуратную библиотеку, которая очень надежна. Вот ссылка https://github.com/Carbs0126/NumberPickerView

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

Я тоже сталкиваюсь с этой проблемой, я использую отражать, чтобы изменить стиль

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();
        }
    }
}
Другие вопросы по тегам