J'utilise la bibliothèque de support Android v21.
J'ai créé un bouton avec une couleur d'arrière-plan personnalisée. Les effets de conception de matériau comme l'ondulation, la révélation ont disparu (sauf l'élévation au clic) lorsque j'utilise la couleur de fond.
<Button
style="?android:attr/buttonStyleSmall"
android:background="?attr/colorPrimary"
android:textColor="@color/white"
android:textAllCaps="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button1"
/>
Ce qui suit est un bouton normal et les effets fonctionnent très bien.
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAllCaps="true"
android:text="Button1"
/>
android
android-5.0-lollipop
Sathesh
la source
la source
Réponses:
Lorsque vous utilisez
android:background
, vous remplacez une grande partie du style et de l'apparence d'un bouton par une couleur vierge.Mise à jour: Depuis la version 23.0.0 d' AppCompat , il existe un nouveau
Widget.AppCompat.Button.Colored
style qui utilise votre thèmecolorButtonNormal
pour la couleur désactivée etcolorAccent
pour la couleur activée.Cela vous permet de l'appliquer directement sur votre bouton via
Si vous avez besoin d'un
colorButtonNormal
ou personnalisécolorAccent
, vous pouvez utiliser unThemeOverlay
comme expliqué dans ce pro-tip etandroid:theme
sur le bouton.Réponse précédente
Vous pouvez utiliser un dessin dans votre répertoire v21 pour votre arrière-plan, comme:
Cela garantira que votre couleur d'arrière-plan est
?attr/colorPrimary
et a l'animation d'ondulation par défaut en utilisant la valeur par défaut?attr/colorControlHighlight
(que vous pouvez également définir dans votre thème si vous le souhaitez).Remarque: vous devrez créer un sélecteur personnalisé pour moins de v21:
En supposant que vous ayez certaines couleurs que vous souhaitez pour l'état par défaut, pressé et concentré. Personnellement, j'ai pris une capture d'écran d'une ondulation au milieu de la sélection et j'ai retiré l'état principal / concentré de cela.
la source
Il existe une autre solution simple pour fournir un arrière-plan personnalisé aux boutons «plats» tout en conservant leurs effets «matériel».
c'est à dire :
Peut être utilisé pour les boutons plats , il fonctionne sur l'API> = 11, et vous obtiendrez un effet d'entraînement sur les appareils> = 21, en gardant les boutons réguliers sur la pré-21 jusqu'à ce que AppCompat soit mis à jour pour prendre en charge l'ondulation également.
Vous pouvez également utiliser selectableItemBackgroundBorderless pour les boutons> = 21 uniquement.
la source
CardView
approche, merci pour le partage!Voici un moyen simple et rétrocompatible de fournir un effet d'entraînement aux boutons surélevés avec l'arrière-plan personnalisé.
Votre mise en page devrait ressembler à ceci
la source
foreground
n'a aucun effet avant le 23. google.com/…J'ai rencontré ce problème aujourd'hui en jouant avec la bibliothèque v22.
En supposant que vous utilisez des styles, vous pouvez définir la
colorButtonNormal
propriété et les boutons utiliseront cette couleur par défaut.En dehors de cela, vous pouvez toujours créer un style pour le bouton, puis l'utiliser par bouton si vous avez besoin d'un assortiment de couleurs (non testé, juste spéculant).
N'oubliez pas d'ajouter
android:
avant les noms des éléments dans votre style v21 .la source
Avec AppCompat (22.1.1+), vous pouvez ajouter un style comme celui-ci:
Et utilisez-le en appliquant simplement le style:
En modifiant la couleur par programme, j'ai trouvé que la seule façon de mettre à jour la couleur (sur l'API 15 ou 16) était d'utiliser à la place la «liste de teintes d'arrière-plan». Et cela ne supprime pas la belle animation radiale sur les appareils API 21:
Parce que
button.setBackground(...)
etbutton.getBackground().mutate().setColorFilter(...)
ne changez pas la couleur des boutons sur les API 15 et 16 comme ils le font sur l'API 21.la source
ColorStateList.valueOf( ... )
pour construire un simpleColorStateList
d'une seule couleur.ViewCompat.setBackgroundTintList(myButton, ColorStateList.valueOf(myColor);
Javadoc poursetSupportBackgroundTintList
dit que cela devrait être appelé ainsi.La réponse de @ ianhanniballake est absolument correcte et simple. Mais il m'a fallu quelques jours pour comprendre. Pour quelqu'un qui ne comprend pas sa réponse, voici une implémentation plus détaillée
=== Ou ===
la source
colorButtonNormal
dans le thème de base@style/AppTheme
. Cela donne une couleur par défaut à AppCompat pour coloriser les boutons en conséquence. Et puis pouvez utiliser votre réponse pour thème une vue individuellement.android:theme="Theme.MaterialButton"
ouandroid:theme="@style/Theme.MaterialButton"
android:theme="@style/Theme.MaterialButton"
. Merci pour votre justesse.J'ai utilisé le backgroundTint et le premier plan:
la source
Je suis venu à ce poste à la recherche d'un moyen d'avoir une couleur d'arrière-plan de mon
ListView
article, tout en conservant l'ondulation.J'ai simplement ajouté ma couleur comme arrière-plan et le selectableItemBackground comme premier plan:
et cela fonctionne comme un charme. Je suppose que la même technique pourrait également être utilisée pour les boutons. Bonne chance :)
la source
Utiliser
backgroundTint
au lieu debackground
la source
Si ImageButton vous intéresse, vous pouvez essayer cette chose simple:
la source
v22.1
deappcompat-v7
introduit de nouvelles possibilités. Il est désormais possible d'assigner un thème spécifique à une seule vue.Ainsi, au lieu de définir la couleur souhaitée dans un thème global, nous en créons une nouvelle et l’affectons uniquement au
Button
Exemple:
Et utilisez ce style comme thème de votre
Button
la source
Si vous êtes d'accord avec l'utilisation d'une bibliothèque tierce, consultez traex / RippleEffect . Il vous permet d'ajouter un effet d'entraînement à n'importe quelle vue avec seulement quelques lignes de code. Il vous suffit d'envelopper, dans votre fichier de mise en page XML, l'élément que vous souhaitez avoir un effet d'entraînement avec un
com.andexert.library.RippleView
conteneur.Comme bonus supplémentaire, il nécessite Min SDK 9 afin que vous puissiez avoir une cohérence de conception entre les versions du système d'exploitation.
Voici un exemple tiré du référentiel GitHub des bibliothèques:
Vous pouvez modifier la couleur de l'ondulation en ajoutant cet attribut à l'élément RippleView:
app:rv_color="@color/my_fancy_ripple_color
la source
Utilisation
et la couleur sera acceptée sur pré-lolipop
la source
Il y a deux approches expliquées dans le grand tutoriel d'Alex Lockwood: http://www.androiddesignpatterns.com/2016/08/coloring-buttons-with-themeoverlays-background-tints.html :
Approche n ° 1: modification de la couleur d'arrière-plan du bouton avec un ThemeOverlay
Approche n ° 2: définition de la teinte d'arrière-plan de AppCompatButton
la source
Application par programme des couleurs:
la source
J'ai essayé ceci:
au lieu de modifier la propriété d'arrière-plan. Cela ne supprime pas l'effet matériel.
la source