23
votes

Impossible de changer la couleur d'arrière-plan sur MaterialButton sans changer de couleur

Android Studio 3.2.1 Voici ma mise en page:

android:background="#aabbcc"

pour changer l' arrière - plan de MaterialButton, je change de colorAccent dans styles.xml

<item name="colorAccent">@color/colorAccent</item>

Agréable. C'est du travail.

Mais le problème est: je ne veux pas changer colorAccent . Je veux utiliser la couleur de l'arrière-plan pour MaterialButton différente de colorAccent

Attribut:

<com.google.android.material.button.MaterialButton
                android:id="@+id/bittrexJsonViewButton"
                android:layout_width="0dp"
                android:layout_height="@dimen/min_height"
                android:layout_marginStart="@dimen/half_default_margin"
                android:layout_marginEnd="@dimen/half_default_margin"
                android:text="@string/json_view"
                app:layout_constraintBottom_toBottomOf="@+id/binanceJsonViewButton"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toEndOf="@+id/binanceJsonViewButton"
                app:layout_constraintTop_toTopOf="@+id/binanceJsonViewButton" />

pas d'aide.


0 commentaires

6 Réponses :


29
votes

1ère solution

Vous pouvez utiliser app:backgroundTint pour changer la couleur de fond de MaterialButton

<com.google.android.material.button.MaterialButton
                android:id="@+id/bittrexJsonViewButton"
                android:layout_width="0dp"
                android:layout_height="@dimen/min_height"
                android:layout_marginStart="@dimen/half_default_margin"
                android:layout_marginEnd="@dimen/half_default_margin"
                app:backgroundTint="@android:color/holo_orange_dark"
                android:text="@string/json_view"
                app:layout_constraintBottom_toBottomOf="@+id/binanceJsonViewButton"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toEndOf="@+id/binanceJsonViewButton"
                app:layout_constraintTop_toTopOf="@+id/binanceJsonViewButton" />

2e solution

MaterialButton utilise colorPrimary comme arrière-plan lorsque le bouton est à l'état actif et colorOnSurface lorsqu'il est désactivé. Ainsi, vous pouvez le définir dans votre thème et l'appliquer sur des boutons matériels


8 commentaires

Je ne peux pas utiliser app: backgroundTint car minSdkVersion 18


essayez la 2ème solution


Je l'ai essayé avec la version min 18. Il n'y a pas de problème. Je pense que vous n'utilisez pas androidX. Si vous souhaitez utiliser de nouveaux composants matériels, je vous recommande de migrer votre projet vers AndroidX


Je migre vers AndroidX. Si vous exécutez l'application sur Android 5.0, le bouton ne change pas la couleur d'arrière-plan. Dans ce cas, application: backgroundTint - pas d'aide.


Ouais, vous devez utiliser le thème AppCompat sur les versions Lolipop et Pre Lolipop, AFIK


app: backgroundTint fonctionne sur 5.0. Je viens de le tester sur LG ayant la version 5.0


colorOnSurface ne fonctionne pas pour moi pour une raison quelconque :(


@ZaidMirza je viens de tester avec v19 et backgroundTint ne fonctionne pas pour moi aussi j'ai migré vers Android X



21
votes

Avec le nouveau bouton Matériau, vous avez 2 options:

  1. Utilisation de l'attribut backgroundTint comme suggéré par Zaid Mirza

  2. C'est la meilleure option à mon avis. Si vous souhaitez remplacer certains attributs de thème d'un style par défaut, vous pouvez utiliser le nouvel attribut materialThemeOverlay .

Quelque chose comme:

<style name="MtButtonStyle"
 parent="Widget.MaterialComponents.Button">
   <item name="materialThemeOverlay">@style/GreenButtonThemeOverlay</item>
</style>

<style name="GreenButtonThemeOverlay">
  <item name="colorPrimary">@color/green</item>
</style>

Il nécessite la version 1.1.0 de la bibliothèque.


3 commentaires

Il nécessite le matériel 1.1.0, qui est inexistant comme indiqué ici


@DarioColetto Merci. La réponse n'était pas claire et je viens de la mettre à jour. Pour utiliser l'attribut materialThemeOverlay la version 1.1.0 est requise. Actuellement, vous pouvez utiliser 1.1.0-beta02 .


@GabrieleMariotti pourriez-vous me faire plaisir avec ce problème stackoverflow.com/questions/60850751/...



5
votes

2020: Il semble qu'ils viennent de résoudre ce problème le 1er avril 2020.

Il devrait être publié sur la version 1.2.0 beta 1 car le problème GitHub a été résolu en tant que "Corrigé"


0 commentaires

5
votes

Si vous souhaitez définir un dessin personnalisé, vous devez créer l' app:backgroundTint="@null" . Pour changer simplement l' app:backgroundTint="@color/yourColor" couleur d'arrière-plan app:backgroundTint="@color/yourColor"

J'utilise actuellement 1.3.0-alpha01

<com.google.android.material.button.MaterialButton
            android:id="@+id/bittrexJsonViewButton"
            android:layout_width="0dp"
            android:layout_height="@dimen/min_height"
            android:layout_marginStart="@dimen/half_default_margin"
            android:layout_marginEnd="@dimen/half_default_margin"
            app:backgroundTint="@null"
            android:background="@drawable/your_custom_drawable"
            android:text="@string/json_view"
            app:layout_constraintBottom_toBottomOf="@+id/binanceJsonViewButton"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/binanceJsonViewButton"
            app:layout_constraintTop_toTopOf="@+id/binanceJsonViewButton" />


0 commentaires

0
votes

Modifiez le backgroundTintMode à add , puis votre attribut d' background - background sera affiché. Voir l'exemple ci-dessous:

<com.google.android.material.button.MaterialButton
                android:id="@+id/bittrexJsonViewButton"
                android:layout_width="0dp"
                android:layout_height="@dimen/min_height"
                android:layout_marginStart="@dimen/half_default_margin"
                android:layout_marginEnd="@dimen/half_default_margin"
                android:text="@string/json_view"
                android:background:"#aabbcc"
                app:backgroundTintMode="add"
                app:layout_constraintBottom_toBottomOf="@+id/binanceJsonViewButton"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toEndOf="@+id/binanceJsonViewButton"
                app:layout_constraintTop_toTopOf="@+id/binanceJsonViewButton" />


0 commentaires

0
votes

Commentaires demandant de désactiver la couleur à l'aide de colorOnSurface, vous devez utiliser les paramètres du thème,

Comme ça:

<style name="MaterialRedButton"
    parent="Widget.MaterialComponents.Button">
    <item name="materialThemeOverlay">@style/MaterialRedButtonThemeOverlay</item>
</style>

<style name="MaterialRedButtonThemeOverlay">
    <item name="colorPrimary">@android:color/holo_red_dark</item>
    <item name="colorOnSurface">@color/white</item>
</style>


0 commentaires