Изменение цвета текста NumberPicker
Я рассмотрел большинство потоков на этом, и никто не дал ответ, который работает. Styling the NumberPicker не работает (согласно этой теме: NumberPicker textColour)
Установка атрибута style на numberPicker в стиль, который имеет элемент цвета, также не имеет никакого эффекта. Также не устанавливайте атрибут textColor в файле numberPicker XML.
Ближе к этому я использую numberPicker, чтобы передать его getChildAt() в EditText, а затем сделать setColor() в этом EditText, но это только меняет цвет ребенка один раз при инициализации, а затем каждый раз выбирается из них; не то, что я ищу.
Любая помощь? Благодаря
Ответы
Ответ 1
Этот код должен решить вашу проблему. Проблема, с которой вы столкнулись, заключается в том, что во время создания NumberPicker он захватывает текст TextColor EditText и назначает его краске, чтобы он мог рисовать числа выше и ниже текста редактирования одним и тем же цветом.
import java.lang.reflect.Field;
public static void setNumberPickerTextColor(NumberPicker numberPicker, int color)
{
try{
Field selectorWheelPaintField = numberPicker.getClass()
.getDeclaredField("mSelectorWheelPaint");
selectorWheelPaintField.setAccessible(true);
((Paint)selectorWheelPaintField.get(numberPicker)).setColor(color);
}
catch(NoSuchFieldException e){
Log.w("setNumberPickerTextColor", e);
}
catch(IllegalAccessException e){
Log.w("setNumberPickerTextColor", e);
}
catch(IllegalArgumentException e){
Log.w("setNumberPickerTextColor", e);
}
final int count = numberPicker.getChildCount();
for(int i = 0; i < count; i++){
View child = numberPicker.getChildAt(i);
if(child instanceof EditText)
((EditText)child).setTextColor(color);
}
numberPicker.invalidate();
}
Ответ 2
Решение, которое я пробовал и работал у меня, это:
В styles.xml add:
<style name="AppTheme.Picker" parent="Theme.AppCompat.Light.NoActionBar" >
<item name="android:textColorPrimary">@android:color/black</item>
</style>
Затем используйте его так:
<NumberPicker
android:id="@+id/dialogPicker"
android:theme="@style/AppTheme.Picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp" />
Ответ 3
Не уверен, почему вам нужно будет погрузиться в API Java Reflection для этого. Это простой стиль. Атрибут, который необходимо переопределить: textColorPrimary
.
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
....
<item name="android:textColorPrimary">#ff0000</item>
</style>
Если вы используете TimePicker
внутри a Dialog
, переопределите android:textColorPrimary
в теме диалога.
Что об этом.
Дополнительная информация:
Вот проницательный комментарий Yoann Hercouet:
Это решение не изменяет только цвет на NumberPicker, он это глобальное изменение, которое повлияет на количество компонентов
Это правильно, но он игнорирует возможности, о которых я намекаю. Более того, global
подразумевает воздействие приложения. Это может быть ограничено областью действия, применяя эту тему только к действиям, содержащим NumberPicker
. Но, я согласен, это может быть слишком агрессивным.
Идея здесь заключается в том, чтобы каким-то образом ввести textColorPrimary=INTENDED_COLOR
в тему, которая будет видна NumberPicker
. Существует несколько способов достижения этого. Здесь один из способов:
Определите стиль голой кости в res/values/styles.xml
:
<style name="NumberPickerTextColorStyle">
<item name="android:textColorPrimary">@color/intended_color</item>
</style>
Теперь создайте пользовательский NumberPicker
:
public class ThemedNumberPicker extends NumberPicker {
public ThemedNumberPicker(Context context) {
this(context, null);
}
public ThemedNumberPicker(Context context, AttributeSet attrs) {
// wrap the current context in the style we defined before
super(new ContextThemeWrapper(context, R.style.NumberPickerTextColorStyle), attrs);
}
}
Наконец, используйте ThemedNumberPicker
в вашем макете (-ах):
<package.name.ThemedNumberPicker
android:id="@+id/numberPicker"
....
....
.... />
Мы успешно нашли влияние, которое textColorPrimary=INTENDED_COLOR
имеет на нашем приложении.
Это, конечно, только один вариант. Например, если вы раздували макет, содержащий NumberPicker
, вы могли бы использовать:
// In this case, the layout contains <NumberPicker... />, not <ThemedNumberPicker... />
LayoutInflater.from(new ContextThemeWrapper(context, R.style.NumberPickerTextColorStyle))
.inflate(R.layout.number_picker_layout, ...);
Ответ 4
Вот фрагмент Xamarin из вышеприведенного ответа с TextSize и TextStyle Bold
public static bool SetNumberPickerTextColorAndSize(NumberPicker numberPicker, Color color, ComplexUnitType complexUnitType, float textSize, TypefaceStyle style)
{
int count = numberPicker.ChildCount;
for (int i = 0; i < count; i++)
{
View child = numberPicker.GetChildAt(i);
if (child.GetType() == typeof(EditText))
{
try
{
Field selectorWheelPaintField = numberPicker.Class
.GetDeclaredField("mSelectorWheelPaint");
selectorWheelPaintField.Accessible = true;
EditText editText = (EditText) child;
editText.SetTextSize(complexUnitType, textSize);
editText.SetTypeface(editText.Typeface, style);
editText.SetTextColor(color);
Paint paint = (Paint) selectorWheelPaintField.Get(numberPicker);
paint.TextSize = TypedValue.ApplyDimension(complexUnitType, textSize, numberPicker.Resources.DisplayMetrics);
paint.Color = color;
paint.SetTypeface(editText.Typeface);
numberPicker.Invalidate();
return true;
}
catch (NoSuchFieldException e)
{
Log.Warn("setNumberPickerTextColor", e);
}
catch (IllegalAccessException e)
{
Log.Warn("setNumberPickerTextColor", e);
}
catch (IllegalArgumentException e)
{
Log.Warn("setNumberPickerTextColor", e);
}
}
}
return false;
}
Ответ 5
Я принял решение @Andreas Merz и обновил его код. То, как вещи были назначены, и функции, которые он использовал, не были найдены. Я использую min API 19
. Вот код, который работал у меня.
/**
* Based on /questions/176356/change-the-text-color-of-numberpicker/990704#990704
* @param picker
* @param color
* @param unit
* @param textSize
* @param typeface
* @return
*/
private void formatNumberPickerText(NumberPicker picker, int color,
int unit, float textSize,
Typeface typeface) {
int count = picker.getChildCount();
for (int i = 0; i < count; i++) {
View child = picker.getChildAt(i);
if (child instanceof EditText) {
try {
Class clazz = picker.getClass();
Field field = clazz.getDeclaredField("mSelectorWheelPaint");
field.setAccessible(true);
EditText editText = (EditText) child;
editText.setTextSize(unit, textSize);
editText.setTypeface(typeface);
editText.setTextColor(color);
Paint paint = (Paint) field.get(picker);
paint.setTextSize(TypedValue.applyDimension(
unit, textSize, getResources().getDisplayMetrics()
));
paint.setColor(color);
paint.setTypeface(typeface);
picker.invalidate();
return;
} catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
}
}
}
}
Ответ 6
Принятый ответ слишком сложный. Более простой подход, который работал у меня, заключался в переопределении атрибута textColorPrimary
темы, которую я использовал.
<style name="Theme.MyTheme" parent="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
<item name="android:textColorPrimary">#000000</item>
</style>
Это хорошо справилось!
Ответ 7
Вместо того, чтобы изменять каждый цвет текста до требуемого цвета, лучше просто изменить весь цвет editText. NumberPicker фактически имеет дочерний EditText, который отображает числа.
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Change edit color here. -->
<item name="android:editTextColor">#000000</item>
</style>
Это сработало для меня. И хотя у меня есть белый текст в кнопках, они не изменились.
Ответ 8
Это код в вашем styles.xml, где определение стилей определено для определенного элемента.
<style name="question_dialog" parent="@android:style/Theme.Holo.Dialog">
<item name="android:textColorPrimary">@android:color/black</item>
<item name="android:background">#ffffff</item>
<item name="android:windowTitleStyle">@style/question_dialog_title</item>
<item name="android:textColor">#000000</item>
</style>
<style name="question_dialog_title" parent="android:Widget.TextView">
<item name="android:background">#ffffff</item>
<item name="android:textColor">#000000</item>
<item name="android:textAlignment">center</item>
<item name="android:text">Please select time</item>
<item name="android:textSize">21sp</item>
</style>
Определенный стиль может быть вызван в вашей функции cusuom в файле .java, как показано ниже
final Dialog d = new Dialog(QuickLaunch.this,R.style.question_dialog);
Ответ 9
Проверьте fooobar.com/questions/11186910/.... Это решит проблему "меняет цвет ребенка только один раз при инициализации, а затем каждый раз, когда он выбирается из него"
Ответ 10
Исходя из отклонения отражения на Android SDK> = 29 лучше изменить ответ Саймона:
public void setNumberPickerTextColor(NumberPicker numberPicker, int color){
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
final int count = numberPicker.getChildCount();
for (int i = 0; i < count; i++) {
View child = numberPicker.getChildAt(i);
if (child instanceof EditText) {
try {
((EditText) child).setTextColor(color);
Field selectorWheelPaintField = numberPicker.getClass().getDeclaredField("mSelectorWheelPaint");
boolean accessible = selectorWheelPaintField.isAccessible();
selectorWheelPaintField.setAccessible(true);
((Paint) selectorWheelPaintField.get(numberPicker)).setColor(color);
selectorWheelPaintField.setAccessible(accessible);
Field selectionDividerField = numberPicker.getClass().getDeclaredField("mSelectionDivider");
accessible = selectionDividerField.isAccessible();
selectionDividerField.setAccessible(true);
selectionDividerField.set(numberPicker, null);
selectionDividerField.setAccessible(accessible);
numberPicker.invalidate();
} catch (Exception exception) {
Logger.exc(exception);
}
}
}
} else {
numberPicker.setTextColor(color);
}
}
В SDK> = 29 NumberPicker имеет метод .setTextColor().
Ответ 11
Для меня установка android:textColorPrimary
в моей теме ничего не сделала, глядя на исходный код NumberPicker
он решает цвет текста из ввода EditText
поэтому вместо этого нужно установить android:editTextColor
.
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:editTextColor">@color/dark_gray</item>
</style>
Ответ 12
Это легко с моей библиотекой NumberPicker.
<com.github.tomeees.scrollpicker.ScrollPicker
...
app:textColor="..."
/>