Как изменить стиль выбора номера в 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();
}
}
}