Ma vue de carte dans Listview ne montre pas d'ombre dans Android L (Nexus 5). De plus, les bords arrondis ne sont pas correctement représentés. Voici le code de la vue de l'adaptateur de Listview:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="@android:color/white"
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="4dp"
app:cardElevation="4dp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="@dimen/padding_small"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ImageView
android:id="@+id/ivPicture"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tvName"
android:layout_centerHorizontal="true"
android:scaleType="fitCenter" />
<TextView
android:id="@+id/tvDetail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ivPicture"
android:layout_centerHorizontal="true"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" />
</RelativeLayout>
</android.support.v7.widget.CardView>
Et le XML ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/app_bg" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:cacheColorHint="#00000000"
android:divider="@android:color/transparent"
android:drawSelectorOnTop="true"
android:smoothScrollbar="true" />
<ProgressBar
android:id="@+id/progressBarMain"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" /></RelativeLayout>
Cela fonctionne bien sur les appareils pré-L avec une ombre appropriée et des coins arrondis. Mais ne fonctionne pas sur un appareil Android L. Pouvez-vous dire ce que je manque ici?
Réponses:
Après avoir parcouru à nouveau la documentation, j'ai finalement trouvé la solution.
Ajoutez simplement
card_view:cardUseCompatPadding="true"
à votreCardView
et des ombres apparaîtront sur les appareils Lollipop.Ce qui se passe, c'est que la zone de contenu dans une
CardView
prise de tailles différentes sur les appareils pré-sucette et sucette. Ainsi, dans les appareils sucette, l'ombre est en fait couverte par la carte, donc elle n'est pas visible. En ajoutant cet attribut, la zone de contenu reste la même sur tous les appareils et l'ombre devient visible.Mon code xml est comme:
la source
card_view:cardElevation="2sp"
à- dire àcard_view:cardElevation="2dp"
?sp
ne doit être utilisé que pour les tailles de texte.dp
doit être utilisé pour toutes les autres dimensions.N'oubliez pas que pour dessiner une ombre, vous devez utiliser le
hardwareAccelerated
dessinhardwareAccelerated = true
hardwareAccelerated = false
Voir Accélération matérielle Android pour plus de détails
la source
utiliser
app:cardUseCompatPadding="true"
dans votre vue de carte. Par exemplela source
check hardwareAccelerated dans le manifeste le rend vrai, le rendant faux supprime les ombres, quand une fausse ombre apparaît dans l'aperçu XML mais pas dans le téléphone.
la source
Ajoutez cette ligne à CardView ....
Conseils
Vous pouvez éviter layout_marginTop et layout_marginBottom car l'ombre elle-même prend un peu d'espace vers le haut et vers le bas de celui-ci. La quantité d'espace définie par combien vous utiliserez dans card_view: cardElevation = "ndp".
Codage heureux (:
la source
Enfin, j'ai pu obtenir des ombres sur l'appareil Lollipop en ajoutant une marge à la vue de la carte. Voici la disposition finale de la vue de la carte:
la source
8dp
assez?Ajoutez simplement ces balises:
Alors c'est devenu:
la source
Vous pouvez ajouter cette ligne de code pour l'ombre en vue carte
Ci-dessous vous avez un exemple
J'espère que cela t'aides!
la source
Vous pouvez essayer en ajoutant cette ligne
Le code entier ressemblera à ceci
la source
Dans mon cas, l'ombre n'apparaissait pas sur les appareils Android L car je n'ai pas ajouté de marge. Le problème est que CardView crée automatiquement cette marge sur <5 appareils, alors maintenant je le fais comme ceci:
la source
Ajoutez android: hardwareAccelerated = "true" dans votre fichier manifestes comme ci-dessous, cela fonctionne pour moi
la source
Tout d'abord, assurez-vous que les dépendances suivantes sont correctement ajoutées et compilées dans le fichier build.gradle
et après cela, essayez le code suivant:
problème surgit dans Android L car l'attribut layout_margin n'est pas ajouté
la source
Mon recyclerview était lent à se charger donc en lisant le stackoverflow.com, j'ai changé hardwareAccelerated à "false" alors l'élévation ne s'affiche pas dans l'appareil. Le je suis redevenu vrai. Ça marche pour moi.
la source
La vue Carte ne peut pas afficher d'ombre car vous
RelativeLayout
êtes dans l'ombre de la vue Carte. Pour afficher l'ombre, ajoutez des marges sur votre vue Carte. Par exemple:la source
Je pense que si vous vérifiez d'abord votre manifeste si vous avez écrit,
android:hardwareAccelerated="false"
vous devrieztrue
avoir une ombre pour la carte Comme cette réponse icila source
Vérifiez que vous n'utilisez pas
android:layerType="software"
dans votre RecyclerView .Le changer pour
android:layerType="hardware"
résoudre le problème pour moi.la source
déplacez votre attribut "uses-sdk" en haut du manifeste comme la réponse ci-dessous https://stackoverflow.com/a/27658827/1394139
la source