Ändern Sie die Textfarbe von NumberPicker

Ich habe die meisten Threads angeschaut und keiner hat eine Antwort gegeben, die funktioniert. Styling der NumberPicker funktioniert nicht (nach diesem Thread: NumberPicker textColour )

Das Setzen des Style-Attributs auf den NumberPicker auf einen Style, der ein Color-Item hat, hat auch keinen Effekt. Auch die Einstellung des textColor-Attributs auf die numberPicker-XML macht nichts.

Nächstes habe ich das mit dem numberPicker, um sein getChildAt () zu einem EditText zu werfen und dann setColor () auf diesem EditText zu machen, aber das ändert nur die Farbe des Kindes einmal bei der Initialisierung und dann jedes Mal, wenn es ausgewählt ist darauf; Nicht das, was ich suche.

Irgendeine Hilfe? Vielen Dank

  • Android: Wie kann ich auf die Standard-Textfarbe zugreifen? (Kein Thema, nur der Standard)
  • Android - Wie kann ich den TextColor in einem TimePicker ändern?
  • Kann Textview Briefe in verschiedenen Farben haben?
  • Ist es möglich, die Textfarbe in einem String in mehrere Farben in Java zu ändern?
  • Android verknüpfen, wie man benutzerdefinierte Link-Farbe einstellen?
  • Android - Wie kombiniert Form drwable und Text Farbe verschiedene Zustände für Knopf?
  • Wie setzt man Farben in MPAndroidChart?
  • Android Linkify Links TextColor ignoriert, CSS Style Overrides möglich?
  • 7 Solutions collect form web for “Ändern Sie die Textfarbe von NumberPicker”

    Dieser Code sollte dein Problem lösen. Das Problem, das Sie erleben, ist, weil bei der Konstruktion von NumberPicker die EditText textColor erfasst und einer Lackierung zuweist, damit sie die Zahlen über und unter dem Text mit der gleichen Farbe zeichnen kann.

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

    Nicht sicher, warum Sie in Java Reflection API tauchen müssen. Es ist eine einfache Styling-Materie. Das Attribut, das Sie überschreiben müssen, ist: textColorPrimary .

     <style name="AppTheme" parent="@android:style/Theme.Holo.Light"> .... <item name="android:textColorPrimary">#ff0000</item> </style> 

    Wenn Sie den TimePicker in einem Dialog , überschreiben Sie android:textColorPrimary im Dialogfeld des Dialogs.

    Das ist alles.

    Zusätzliche Information:

    Hier ist ein aufschlussreicher Kommentar von Yoann Hercouet :

    Diese Lösung ändert sich nicht nur die Farbe auf dem NumberPicker, es handelt sich um eine globale Änderung, die sich auf viele Komponenten auswirken wird

    Das ist richtig, aber es übersieht die Möglichkeiten, die ich ansehe. Darüber hinaus impliziert global Auswirkungen. Das kann sich auf den Aktivitätsbereich beschränken, indem er dieses Thema nur auf Aktivitäten mit dem NumberPicker . Aber ich stimme zu, das kann noch zu korrosiv sein .

    Der Gedanke hier ist, irgendwie in das Thema, das von NumberPicker gesehen wird, textColorPrimary=INTENDED_COLOR zu NumberPicker . Es gibt mehrere Möglichkeiten, dies zu erreichen. Hier ist ein Weg:

    Definiere einen Bare-Knochen-Stil in res/values/styles.xml :

     <style name="NumberPickerTextColorStyle"> <item name="android:textColorPrimary">@color/intended_color</item> </style> 

    Erstellen Sie nun einen benutzerdefinierten 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); } } 

    Verwenden ThemedNumberPicker schließlich ThemedNumberPicker in Ihrem Layout:

     <package.name.ThemedNumberPicker android:id="@+id/numberPicker" .... .... .... /> 

    Wir haben die Auswirkungen, die textColorPrimary=INTENDED_COLOR auf unsere App hat, erfolgreich enthalten.

    Das ist natürlich nur eine Option. Zum Beispiel, wenn Sie ein Layout mit einem NumberPicker , könnten Sie verwenden:

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

    Die Lösung, die ich für mich ausprobiert habe, ist:

    In styles.xml hinzufügen:

     <style name="AppTheme.Picker" parent="Theme.AppCompat.Light.NoActionBar" > <item name="android:textColorPrimary">@android:color/black</item> </style> 

    Dann benutze es so in deinem Layout:

      <NumberPicker android:id="@+id/dialogPicker" android:theme="@style/AppTheme.Picker" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" /> 

    Hier ist ein Xamarin-Snippet aus der obigen Antwort mit TextSize und 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; } 

    Die akzeptierte Antwort ist zu kompliziert. Ein viel einfacher Ansatz, der für mich arbeitete, war, das: textColorPrimary Attribut des Themas, das ich verwendete, zu überschreiben.

     <style name="Theme.MyTheme" parent="@android:style/Theme.Holo.NoActionBar.Fullscreen" > <item name="android:textColorPrimary">#000000</item> </style> 

    Es hat den Job ganz gut gemacht!

    Anstatt jede Textfarbe auf die gewünschte Farbe zu ändern, ändere einfach nur alle editText Farbe. NumberPicker hat eigentlich ein Kind EditText, das die Zahlen anzeigt.

     <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> <!-- Change edit color here. --> <item name="android:editTextColor">#000000</item> </style> 

    Das hat für mich gearbeitet Und obwohl ich weißen Text in den Buttons habe, haben sie sich verändert.

    Ich nahm die Lösung von @Andreas Merz und aktualisiert seinen Code. Die Art und Weise, wie die Dinge zugewiesen wurden und die Funktionen Signaturen / Anrufe, die er benutzte, wurden nicht gefunden. Ich verwende min API 19 . Hier ist der Code, der für mich gearbeitet hat.

     /** * 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(); } } } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.