CardView couleur de fond des états de non-respect des
En bref:
Comment pouvons-nous définir les états de couleur de CardView de cardBackgroundColor propriété (dans une liste mise en page, dans ce cas)?
(Je suis en utilisant la RC1 de Android L developer preview, sur un téléphone avec 4.4 installé, et "com.android.support:cardview-v7:21.0.0-rc1" dans la construction.gradle)
Plus:
Dans CardView mise en page, nous avons mis le rayon de l'angle et de la couleur de fond de la CardView via cardCornerRadius et cardBackgroundColor.
Cependant, la couleur de fond n'est pas repect certains etats, c'est à dire si l'élément de la liste est pressé, par exemple.
Si, dans le point de vue interne de la CardView, vous pouvez définir une couleur d'arrière-plan, et les états associés, qui sont respectés, cependant, il affiche sur les coins que vous avez défini dans le CardView.
Alors, comment pouvons-nous nous assurer que les etats en CardView de cardBackgroundColor sont-elles respectées?
Voici la couleur utilisée pour la cardBackgroundColor, colour_with_states.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:color="@android:color/holo_green_dark" />
<item android:state_focused="true" android:state_enabled="false" android:color="@android:color/holo_green_dark" />
<item android:state_focused="true" android:state_pressed="true" android:color="@android:color/holo_green_dark" />
<item android:state_focused="false" android:state_pressed="true" android:color="@android:color/holo_green_dark" />
<item android:state_focused="true" android:color="@android:color/holo_green_dark" />
<!-- Only this below is seen in the cardview dispaly -->
<item android:color="@android:color/holo_blue_bright" />
</selector>
Et la mise en page qui utilise le CardView:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
cardview:cardCornerRadius="10dp"
cardview:cardBackgroundColor="@color/colour_with_states"
>
<!-- If we set a background color below, it will overwrite our radius defined above -->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:text="Lorem ipsum"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItem"
android:background="@null"
android:gravity="center_vertical"
android:paddingTop="8dip"
android:paddingBottom="8dip"
android:paddingStart="8dip"
android:paddingEnd="8dip"
/>
</android.support.v7.widget.CardView>
- Le fait d'utiliser la même couleur de fond dans une
FrameLayout
égard, les états choisis? Je prends ce que vous appelezsetOnClickListener
sur votreCardView
? - Je pense que la réponse est dans votre question:
If, in the inner view of the CardView, you set a background colour, and associated states, which are respected, however, it will display over the corners you defined in the CardView.
. Le ViewGroup parent (carte) est de routage se concentrer et les événements de la vue enfant. Aussi,ListView
a son propreselector
pour mettre en évidence les éléments sélectionnés. - n'est pas la façon dont il fonctionne. Vous devez tester android:duplicateParentState. Par ce moyen à la fois de la mère ET de tout intéressé les enfants peuvent implicitement répondre avec XML sélecteurs à des événements d'intérêt. CardView sauts de ce modèle, et ne peut pas entendre le parent sélection changement d'état, probablement parce que l'attribut en question est le spécial cardview:cardBackgroundColor, pas le générique android:arrière-plan.
- Espérons que [ce][1] peut vous aider [1]: stackoverflow.com/questions/24518376/...
Vous devez vous connecter pour publier un commentaire.
Si ce n'est pas l'idéal, car les bords ne sont pas arrondis, vous pouvez ajouter le retour tactile pour une
CardView
comme ceci :L'ajout de la
android:foreground
etandroid:clickable
attributs de laCardView
.Aussi ce qui a un effet secondaire négatif en ce que le
android:clickable
attribut remplace toute clickListener, et donc ceux clickListeners ne pas se déclencher.Mise à jour
J'ai quelques exemples de CardView implémentations
Boucle (https://github.com/lawloretienne/Loop) -
https://github.com/lawloretienne/Loop/blob/master/app/src/main/res/layout/category_card.xml
QuickReturn (https://github.com/lawloretienne/QuickReturn) - https://github.com/lawloretienne/QuickReturn/blob/master/sample/src/main/res/layout/activity_quick_return.xml
Mise à jour 2
Après plus de recherches, j'ai trouver une bonne solution pour CardViews sur toutes les versions de l'API, y compris pré-Sucette.
https://medium.com/@etiennelawlor/layout-tips-for-pre-and-post-lollipop-bcb2e4cdd6b2#.9h0v1gmaw
Parfois, vous souhaiterez peut-être les
CardView
visuelles en retour tactile. Leandroid:foreground="?android:attr/selectableItemBackground"
solution est parfaite pour ça.Cependant, vous pouvez envisager d'utiliser
drawSelectorOnTop(true)
avec votre Liste. Cela nécessitera pas de modification sur votreCardView
à tous.Laissez-moi savoir si d'autres précisions sont nécessaires.
Voici ma façon de résoudre votre problème.
Tout d'abord, créer une classe personnalisée nommée
CustomCardView
s'étendCardView
Ensuite remplacer le
drawableStateChanged()
méthode, changer la carte de couleur de fond par appelsetCardBackgroundColor()
méthode lorsque la carte de presse de changement de statut.Dernier, remplacer le CardView avec cette CustomCardView dans vous fichier de mise en page.
le seul inconvénient de cette solution est cardview ne peut pas afficher l'ondulation de la presse d'effet sur Android 5.0 et au-dessus.
voici mon code:
}
Une solution de contournement que j'ai utilisé était de faire le changement de l'INTERFACE par programme en remplaçant la Vue.OnTouchListener OnTouch() du gestionnaire d'événement à l'intérieur de mon custom ViewHolder.
**Il suffit d'ajouter des lignes à l'intérieur de la carte d'affichage **
J'ai utilisé une forme de rectangle, avec le même rayon que le cardview. Et ensuite utilisé le xml drawable comme arrière-plan pour le point de vue interne de la cardview.
L'arrière-plan ne s'affiche pas sur cardview coin, si j'ai toujours une petite marge entre la carte et son point de vue interne.
Si vous regardez la définition de carBackgroundColor de la propriété, au moins dans android support library c'est:
Ici il dit qu'il ne prend que de la couleur pour cardBackgroundValue. Je suppose que cela signifie sélecteur n'est pas respecté, mais passe à travers la valeur par défaut d'ie. couleur au bas du sélecteur.
Utilisation
android:foreground
au lieu deandroid:background
dans votre<CardView/>
. ci-dessous sont un exemple de code d'un CardView .Vous pouvez utiliser la couleur de l'etat dans le code et il fonctionne parfaitement.
en couleur > card_view_selectable.xml
Ensuite utiliser isActivated causer la couleur d'arrière-plan modifié pour state_activated ou par défaut.