android - Cambiar el color del texto de NumberPicker
textcolor (7)
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;
}
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
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.
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Change edit color here. -->
<item name="android:editTextColor">#000000</item>
</style>
Esto funcionó para mí. Y aunque tengo texto en blanco en los botones, no han cambiado.
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 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.
<style name="Theme.MyTheme" parent="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
<item name="android:textColorPrimary">#000000</item>
</style>
¡Hizo el trabajo bastante bien!
La solución que probé y funcionó para mí es:
En styles.xml, agregue:
<style name="AppTheme.Picker" parent="Theme.AppCompat.Light.NoActionBar" >
<item name="android:textColorPrimary">@android:color/black</item>
</style>
Entonces úsala así en tu diseño:
<NumberPicker
android:id="@+id/dialogPicker"
android:theme="@style/AppTheme.Picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp" />
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
.
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
....
<item name="android:textColorPrimary">#ff0000</item>
</style>
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 alcance 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
:
<style name="NumberPickerTextColorStyle">
<item name="android:textColorPrimary">@color/intended_color</item>
</style>
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):
<package.name.ThemedNumberPicker
android:id="@+id/numberPicker"
....
....
.... />
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 <NumberPicker... />, not <ThemedNumberPicker... />
LayoutInflater.from(new ContextThemeWrapper(context, R.style.NumberPickerTextColorStyle))
.inflate(R.layout.number_picker_layout, ...);
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://.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();
}
}
}
}