Cambiar el color del texto de NumberPicker

He visto la mayoría de los hilos en esto y ninguno proporcionó una respuesta que funcione. El estilo del NumberPicker no funciona (según este hilo: NumberPicker textColour )

Establecer el atributo de estilo en numberPicker a un estilo que tiene un elemento de color tampoco tiene ningún efecto. Tampoco hace nada el ajuste del atributo textColor en el XML numberPicker.

Lo más cerca que tengo de esto es usar numberPicker para convertir su getChildAt () en EditText y luego hacer setColor () en ese EditText, pero eso solo cambia el color del niño una vez que se inicializa y luego cada vez que se selecciona desde sobre eso; no es lo que estoy buscando tampoco.

¿Alguna ayuda? Gracias

Este código debería resolver tu problema. El problema que está experimentando se debe a que durante la construcción de NumberPicker captura el EditText textColor y lo asigna a una pintura para que pueda dibujar los números arriba y abajo del texto de edición con el mismo color.

import java.lang.reflect.Field; public static boolean setNumberPickerTextColor(NumberPicker numberPicker, int color) { final int count = numberPicker.getChildCount(); for(int i = 0; i < count; i++){ View child = numberPicker.getChildAt(i); if(child instanceof EditText){ try{ Field selectorWheelPaintField = numberPicker.getClass() .getDeclaredField("mSelectorWheelPaint"); selectorWheelPaintField.setAccessible(true); ((Paint)selectorWheelPaintField.get(numberPicker)).setColor(color); ((EditText)child).setTextColor(color); numberPicker.invalidate(); return true; } catch(NoSuchFieldException e){ Log.w("setNumberPickerTextColor", e); } catch(IllegalAccessException e){ Log.w("setNumberPickerTextColor", e); } catch(IllegalArgumentException e){ Log.w("setNumberPickerTextColor", e); } } } return false; } 

La solución que probé y funcionó para mí es:

En styles.xml, agregue:

  

Entonces úsala así en tu diseño:

   

No estoy seguro de por qué necesitaría sumergirse en la API de reflexión de Java para esto. Es una cuestión de diseño simple. El atributo que debe sobrescribir es: textColorPrimary .

  

Si está utilizando TimePicker dentro de un TimePicker Dialog , anule android:textColorPrimary en el tema del diálogo.

Eso es todo.

Información adicional:

Aquí hay un comentario profundo de Yoann Hercouet :

Esta solución no solo cambia el color en el NumberPicker, es un cambio global que afectará MUCHOS componentes

Esto es correcto, pero pasa por alto las posibilidades que estoy insinuando. Además, global implica un impacto en toda la aplicación. Esto puede limitarse al scope de la actividad aplicando este tema solo a actividades que contengan NumberPicker . Pero, estoy de acuerdo, esto puede ser demasiado corrosivo .

La idea aquí es inyectar textColorPrimary=INTENDED_COLOR alguna manera en el tema que verá NumberPicker . Hay múltiples formas de lograr esto. Aquí hay una forma:

Defina un estilo bare-bone en res/values/styles.xml :

  

Ahora, cree un NumberPicker personalizado:

 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); } } 

Finalmente, use ThemedNumberPicker en su (s) diseño (es):

  

Hemos contenido correctamente el impacto que textColorPrimary=INTENDED_COLOR tiene en nuestra aplicación.

Esta es, por supuesto, solo una opción. Por ejemplo, si estuviera inflando un diseño que contiene un NumberPicker , podría usar:

 // In this case, the layout contains , not  LayoutInflater.from(new ContextThemeWrapper(context, R.style.NumberPickerTextColorStyle)) .inflate(R.layout.number_picker_layout, ...); 

Aquí hay un fragmento de Xamarin de la respuesta anterior con TextSize y 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; } 

La respuesta aceptada es demasiado complicada. Un enfoque mucho más simple que funcionó para mí fue anular el atributo: textColorPrimary del tema que estaba usando.

  

¡Hizo el trabajo bastante bien!

En lugar de cambiar cada color de texto al color que desea, mejor simplemente cambiando todo el color de edición de texto. NumberPicker en realidad tiene un EditText infantil que muestra los números.

   

Esto funcionó para mí. Y aunque tengo texto en blanco en los botones, no han cambiado.

Tomé la solución de @Andreas Merz y actualicé su código. La forma en que se asignaron las cosas y las funciones firmas / llamadas que utilizó no se encontraron. Estoy usando min API 19 . Aquí está el código que funcionó para mí.

 /** * Based on https://stackoverflow.com/a/26657169/2313889 * @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(); } } } }