Widget.AppCompat.Button colorButtonNormal zeigt Grau an

68

Ich habe values:styles.xmlmit:

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
    <item name="colorButtonNormal">@color/my_color</item>
    <item name="android:textColor">@android:color/white</item>
</style>

und values-v21:styles.xmlmit:

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
      <item name="android:colorButtonNormal">@color/my_color</item>
      <item name="android:textColor">@android:color/white</item>
</style>

Und App-Stil mit

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
      <item name="android:buttonStyle">@style/AppTheme.Button</item>
</style>

Aber die Farben erscheinen grau statt @color/my_color

Daniel Gomez Rico
quelle
20
Sie sollten eine Antwort akzeptieren, damit andere wissen, welche Lösung funktioniert.
Ben
@ Ben Sie haben Recht
Severin.Julien
2
Es gibt keine Antwort ...
Daniel Gomez Rico
Ich glaube, ich habe alle folgenden Antworten (in Android Studio 3.4 Designer, API 28) ohne Erfolg ausprobiert: mit / ohne Android-Präfix; Stil / Thema; Schaltflächenthema & globales Thema (angewendet auf Schaltfläche). Alle Fälle erzeugen entweder ungestyltes Grau oder gestyltes Akzent (niemals meine gewählte Farbe).
Charles-Allen

Antworten:

59

Um nur eine Schaltfläche anzupassen, setzen Sie android: theme = "@ style / AppTheme.Button" auf Ihre Schaltfläche.

<Button
    android:theme="@style/AppTheme.Button"
    />

Definieren Sie Ihren Stil wie in Ihrer Frage

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
    <item name="colorButtonNormal">@color/my_color</item>
</style>

[BEARBEITEN]

Siehe GitHub-Demo hier

Oleksandr
quelle
Ja, aber ich möchte die Farbe des Knopfes einstellen
Daniel Gomez Rico
1
@danielgomezrico Ich habe eine Demo erstellt und auf GitHub veröffentlicht. Siehe mein Update zur Antwort
Oleksandr
6
Ich habe style = .. statt android gemacht: theme = ... Danke!
Daniel Wilson
1
@PrashanthDebbadwar, versuche das Attribut android: onClick in xml zu entfernen. Wenn Sie wirklich Probleme mit diesem Parameter haben, definieren Sie den Klick-Listener im Code mit setOnClickListener (...). Aber dieses Problem klingt wirklich komisch. Wenn ich Zeit habe, werde ich versuchen, es auch zu überprüfen.
Oleksandr
1
Warum funktioniert es mit Android: Theme und nicht mit Android: Style? Ist das nicht ein Thema für die Verwendung eines Stils bei Kindern?
DennisVA
49

Verwenden Sie Widget.AppCompat.Button.Coloredals Eltern für Ihren Stil.

<style name="RedButton" parent="Widget.AppCompat.Button.Colored">
    <item name="android:textColor">@color/white</item>
    <item name="colorButtonNormal">@color/red</item>
</style>

Verwenden Sie android:theme, nicht stylein Schaltflächendefinitionen:

<Button android:theme="@style/RedButton"/>

Siehe AppCompat v21> Theming und Android Support Library v22.1 - AppCompat- Blogbeiträge. (Hinweis zum zweiten Beitrag, android:themewird von API11 unterstützt - er führt nur keine automatische Vererbung vom Elternteil durch. Sie müssen ihn für jedes Kind angeben, hier kein Problem, aber erwähnenswert - siehe Chris Banes ' Beitrag dazu).

Valentin
quelle
1
Warum Widget.AppCompat.Button.Colored?
Daniel Gomez Rico
11
@ Valentin +1 für Android: Thema
Rinav
1
Wenn dies bei Ihnen immer noch nicht funktioniert, insbesondere wenn Sie das Support-Dialogfragment in Android 5 oder höher verwenden, versuchen Sie, colorButtonNormal android voranzustellen. Das heißt:android:colorButtonNormal
user3533716
14

Fügen Sie die XML-Zeile unten in Ihre "AppTheme" -Xml ein, anstatt zu versuchen, sie über den "AppTheme.Button" festzulegen. Dies funktioniert für mich unter Version 22.1.1 mit Geräten ohne Lutscher. Ich vermute, dies ist ein Fehler, da Ihre obige Lösung für Lollipop gut funktioniert.

<item name="colorButtonNormal">@color/my_color</item>
tylerjroach
quelle
14

Stellen Sie sicher, dass Ihre Activityerweitert wird AppCompatActivity, da sonst die appCompat-Stile nicht ordnungsgemäß verarbeitet werden.

  • Klasse: android.support.v7.app.AppCompatActivity
  • Gradle: compile 'com.android.support:appcompat-v7:23.0.1'
John
quelle
13

Verwenden:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="buttonStyle">@style/AppTheme.Button</item>
</style>

entferne das android:

Douglas Fornaro
quelle
9

Das funktioniert:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- android:buttonStyle for v21+ and buttonStyle for the rest -->
    <item name="buttonStyle">@style/MyCustomButton</item>
    <item name="android:buttonStyle">@style/MyCustomButton</item>
    <item name="colorButtonNormal">@color/my_color</item>
</style>

<style name="MyCustomButton" parent="Base.Widget.AppCompat.Button">
    <item name="android:textColor">#ffffff</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
</style>

colorButtonNormalkann im Themenstil eingestellt werden. Um die buttonStyleTextfarbe , -größe oder eine andere Funktion der Schaltfläche zu ändern, können Sie einen Stil erstellen und dann (weniger als v21) oder android:buttonStyle(v21 +) im Themenstil verwenden, um den Schaltflächenstil festzulegen.

Ana María Martínez Gómez
quelle
3

v21 / styles.xml

    <style name="AppTheme.BlueButton" parent="Widget.AppCompat.Button.Colored">
        <item name="android:colorButtonNormal">@color/blue</item>
        <item name="android:textColor">@color/text_white</item>
    </style>

styles.xml

<style name="AppTheme.BlueButton" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/blue_tint</item>
    <item name="android:textColor">@color/text_white</item>
</style>

Anfangs bin ich auch mit diesem Problem konfrontiert. Nach der Korrektur wie oben habe ich die richtige UI-Schaltfläche erhalten

JEGADEESAN S.
quelle
Und du android:buttonStylestellst auch ein oder wie stellst du den Stlyle auf den Knopf?
Daniel Gomez Rico
2
Ich habe dies verwendet -> android: theme = "@ style / AppTheme.BlueButton '"
JEGADEESAN S
aber die Frage ist über die Verwendung, android:buttonStyleaber danke
Daniel Gomez Rico
2

Es scheint ein Fehler im Android-Framework zu sein, den wir nicht colorButtonNormalmit dem Widget.AppCompat.ButtonThema anpassen können .
Eine Problemumgehungslösung besteht darin, ein anderes benutzerdefiniertes AppCompatThema zu definieren und colorAccentzum Festlegen zu verwenden colorButtonNormal.

Es gibt zwei folgende Schritte.
1. Definieren Sie ein anderes Thema für Ihre benutzerdefinierte Schaltfläche.

<resources>

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
  </style>

  <!-- Custom button theme. -->
  <style name="CustomButtonTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Set your desired button color here. -->
    <item name="colorAccent">@color/red</item>
    <item name="buttonStyle">@style/Widget.AppCompat.Button.Colored</item>
  </style>
</resources>

2.Wenden Sie das Schaltflächenthema im Layout an.

<Button android:theme="@style/CustomButtonTheme"/>
Quang Nguyen
quelle
1

Für den Fall , fragt man sich, warum colorButtonNormalnicht abgeholt wird als für Behinderte Tasten definiert, können Sie auch festlegen müssen , android:disabledAlphaum 1.0in Ihrem Thema, sonst wird Ihre Farbe wird durch Standard Mischung in den Hintergrund der Schaltfläche. Beispiel:

<style name="MyButtonTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:disabledAlpha">1.0</item>
    <item name="colorButtonNormal">@color/my_solid_disabled_color</item>
    <item name="colorAccent">@color/my_solid_accent_color</item>
    <item name="buttonStyle">@style/my_button_style</item>
</style>
Thomas Keller
quelle
1

Versuchen Sie buttonStyle anstelle von android: buttonStyle, da dies das AppCompat-Attribut vor Lollipop ist und es daher ohne Android-Präfix sein sollte

Sahan
quelle
0

Hallo, ich denke, das übergeordnete Widget, das Sie verwendet haben, ist möglicherweise nicht korrekt. android:Widget.ButtonFür API-Version 21 oder eine frühere Version sollte es für spätere Version 21 oder höher `android: Widget.Material.Button verwenden. Angenommen, Sie haben einen Standardstil (siehe unten).

res/values/styles.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:buttonStyle">@style/AppTheme.Button</item>
    </style>

    <style name="AppTheme.Button" parent="android:Widget.Button">
        <item name="android:background">@color/my_color</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

</resources>

Für API-Version 21 sollte die Ressourcenstildatei wie folgt aussehen (res / values-v21 / style.xml).

<resources>

    <style name="AppTheme.Button" parent="android:Widget.Material.Button">
        <item name="android:background">@color/my_color</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

</resources>

Vielen Dank Lassen Sie mich wissen, wenn Sie Fragen haben.

Bhavdip Sagar
quelle
Aber Base.Widget.AppCompat.Buttontu das nicht für mich (der Material / Compat Check)?
Daniel Gomez Rico
Verwenden Sie einfach das Button Widget. Es funktioniert automatisch auf Pre-Lollipop, wenn Sie das AppCompat-Design verwenden. Zumindest sagt das das offizielle Dokument.
Sharj
Kannst du bitte den Link dazu posten?
Daniel Gomez Rico