Comment spécifier Android:state_selected
Dans un RippleDrawable
J'ai le XML suivant pour l'ondulation, mais la couleur d'arrière-plan n'apparaît pas lorsque je définis myView.setSelected(true);
<?xml version="1.0" encoding="utf-8"?>
<ripple
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="#DDDDDD"
>
<item Android:id="@Android:id/mask">
<shape>
<solid
Android:color="@color/black" />
</shape>
</item>
<item Android:state_selected="true">
<shape>
<solid
Android:color="#EEEEEE" />
</shape>
</item>
<item>
<color Android:color="#FFFFFF" />
</item>
</ripple>
J'ai trouvé la réponse, juste au cas où quelqu'un d'autre aurait le même problème
<?xml version="1.0" encoding="utf-8"?>
<ripple
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="#DDDDDD"
>
<item>
<selector>
<item Android:state_selected="true">
<color Android:color="#EEEEEE" />
</item>
<item Android:state_activated="true">
<color Android:color="#EEEEEE" />
</item>
<item>
<color Android:color="#FFFFFF" />
</item>
</selector>
</item>
</ripple>
Pour ajouter à la réponse de @Sohaib:
@Alanv a raison de dire que l'OP n'avait pas besoin d'un masque. Mais si l'un de vos états de sélecteur est transparent et que vous avez besoin d'un masque, il va ici:
<?xml version="1.0" encoding="utf-8"?>
<ripple
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="@color/ripple_color">
<!-- mask here... -->
<item Android:id="@Android:id/mask">
<color Android:color="@color/black"/> <!-- any color will do -->
</item>
<item>
<selector>
<!-- ... NOT here. -->
<item Android:state_selected="true">
<color Android:color="@color/blue"/>
</item>
<item Android:state_activated="true">
<color Android:color="@color/red"/>
</item>
<item>
<color Android:color="@color/transparent"/>
</item>
</selector>
</item>
</ripple>
Au départ, j'avais le masque dans mon sélecteur et: boom:
Combiner la réponse ci-dessus avec d'autres réponses de:
Quelle devrait être la couleur de l'ondulation, colorPrimary ou colorAccent? (Material Design)
Donne un bel effet d'entraînement qui fonctionne également lorsque l'élément est dans un état sélectionné.
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?attr/colorControlHighlight">
<!-- Ripple mask - applied to all selector states -->
<item Android:id="@Android:id/mask">
<color Android:color="#42ffffff" />
</item>
<!-- Selected state of item -->
<item>
<selector>
<item Android:state_selected="true">
<color Android:color="?attr/colorAccent" />
</item>
</selector>
</item>
</ripple>
Cela va dans votre dossier drawable-v21, pour d'autres plates-formes, vous pouvez simplement créer un sélecteur qui utilise la couleur d'accentuation:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/accent" Android:state_selected="true"/>
<item Android:drawable="@color/accent" Android:state_pressed="true"/>
</selector>
Je voulais imiter le comportement des cases à cocher Material Design mais je ne pouvais pas les faire correctement jusqu'à ce que j'utilise un ColorStateList comme celui-ci:
Dans drawable-v21/bg_checkbox_ripple.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="@color/checked_accent_statelist"
Android:radius="24dp">
</ripple>
En couleur/vérifié_accent_statelist.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:color="?colorControlHighlight" Android:state_checked="false"/>
<item Android:color="?android:textColorHighlight" Android:state_checked="true"/>
</selector>
L'attribut "? Android: textColorHighlight" est votre couleur d'accent mais avec la bonne transparence pour l'utiliser en ondulations (je pense que c'est 26%).
En outre, vous devez fournir une solution de secours pour les périphériques pré-API 21 dans drawable/bg_checkbox_ripple.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:exitFadeDuration="@Android:integer/config_shortAnimTime">
<item>
<shape Android:innerRadius="24dp" Android:shape="oval">
<solid Android:color="@color/checked_accent_statelist"/>
</shape>
</item>
</selector>