Je souhaite créer l'application Material Designed
pour Android et j'essaie de suivre toutes les suggestions de Google concernant la création de mises en page Nice spécialement pour la nouvelle RecylcerView
. La RecyclerView
a un avatar ImageView
, un titre et un sous-titre TextView
et une icône d'action ImageView
.
Quelles valeurs dois-je attribuer aux propriétés d'ImageView pour width
et height
afin qu'il prenne en charge différentes tailles et densités d'écran et quelle taille de ces tirables dois-je choisir dans le pack d'icônes système?
Suggestion pour les listes:
???
dans le code XML sont les choses inconnues que je ne sais pas quoi mettre là:
XML:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.CardView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/card_view_friend"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp"
card_view:cardUseCompatPadding="true">
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">???
<ImageView
Android:id="@+id/friend_profile_picture"
Android:layout_width="40dp"???
Android:layout_height="40dp"???
Android:layout_alignParentLeft="true"
Android:layout_margin="16dp"
Android:layout_centerVertical="true"
Android:src="@drawable/ic_person_grey600_48dp"/>???
<TextView
Android:id="@+id/friend_name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_toLeftOf="@+id/friend_online_imageview"
Android:layout_toRightOf="@+id/friend_profile_picture"
Android:paddingTop="20dp"
Android:text="@string/plain_text_for_preview"
Android:textSize="16sp"/>
<TextView
Android:id="@+id/friend_state"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/friend_name"
Android:layout_toLeftOf="@id/friend_online_imageview"
Android:layout_toRightOf="@+id/friend_profile_picture"
Android:paddingBottom="20dp"
Android:text="@string/plain_text_for_preview"
Android:textSize="14sp"/>
<ImageView
Android:id="@+id/friend_online_imageview"
Android:layout_width="wrap_content"???
Android:layout_height="wrap_content"???
Android:layout_alignParentRight="true"
Android:layout_margin="16dp"
Android:layout_centerVertical="true"
Android:src="@drawable/ic_messenger_grey600_18dp"/>???
</RelativeLayout>
</Android.support.v7.widget.CardView>
APERÇU:
# 1 Deux lignes:
Layout minHeight
est 72dp, layout_height
est wrap_content
. La taille des icônes est de 40dp (généralement une image bitmap de cercle). L'icône a une marge supérieure de 16dp et une marge gauche de 16dp, pas d'autre.
Les deux TextView
s sont dans une LinearLayout
orientée verticalement et centrée verticalement. Cette disposition a une marge gauche de 16dp et une marge droite de 16dp. Cela vous permettra de supprimer l'image tout en conservant les marges latérales intactes. La première ligne a généralement textApperance="@style/TextAppearance.AppCompat.Body2"
et la deuxième ligne a Body1
. La disposition du texte a 16dp top et 16dp bottom padding (elle doit être ici, car la marge inférieure n'est pas respectée pour les enfants de RelativeLayout
- et est utile à d'autres moments). Maintenant, vous pouvez mettre plusieurs lignes dans la seconde TextView
et l’élément tout entier se développera bien.
N'oubliez pas de définir layout_toRightOf="@+id/icon"
et layout_alignWithParentIfMissing="true"
sur la disposition du texte. Si vous avez une autre icône (ou un widget) à droite, ajoutez layout_toLeftOf="@+id/right_icon"
. Si non, utilisez layout_alignParentRight="true"
. Cela étendra la mise en page pour occuper tout l'espace disponible. Ou vous pouvez utiliser LinearLayout
.
Mettez ceci dans une liste dans votre zone de contenu. Il n’est pas nécessaire que la liste ait un rembourrage en haut ou en bas, elle aura fière allure.
# 2 Éléments de ligne uniques dans le contenu
Identique au numéro 1 avec les différences suivantes: minHeight
ou layout_height
est défini sur 56dp. N'utilisez pas de marges verticales ni de rembourrages, mais centrez tout verticalement. Utilisez un texte d'une seule ligne.
Utilisez ceci dans une liste avec un remplissage en 8dp ou un en-tête de 48dp en haut et un remplissage en 8dp en bas. Sinon, cela aura l'air "coupé".
# 3 Éléments individuels dans les menus
Identique au numéro 2 avec les différences suivantes: La hauteur est de 48dp. L'icône est 24dp. L'icône doit avoir les attributs suivants:
Android:layout_width="40dp"
Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Cela vous permettra de placer n'importe quelle icône de 1dp à 40dp sans perturber l'équilibre (vous n'avez pas besoin de modifier l'espacement entre l'icône et le texte car il reste 40dp comme dans les cas précédents).
Je l'utilise dans un tiroir de navigation et des menus.
Note éditée
Selon les spécifications, les marges gauche et droite des éléments doivent être de 24dp au lieu de 16dp pour les tablettes (sw600dp). Vous pouvez résoudre ce problème en ajoutant 8dp sur les tablettes (en utilisant des valeurs dynamiques).
Les spécifications indiquent également que le séparateur entre les éléments (le cas échéant) devrait en faire partie. Vous devez définir la "dimension de la marge gauche totale" de 72dp pour les téléphones et de 80dp pour les tablettes et l'utiliser comme marge de gauche pour la vue de division. Le deuxième problème est que sur les tablettes, vous avez un rembourrage à droite de 8dp. Je dis ceci: Si vous utilisez ListView
, vissez les spécifications et définissez un séparateur personnalisé, qui sera peint entre les éléments. Si vous utilisez RecyclerView
, écrivez une jolie ItemDecorator
qui ajoutera le séparateur sur l'élément.
EDIT 2
?listPreferredPaddingLeft
et ?listPreferredPaddingRight
passeront à 16dp sur les téléphones et à 24dp sur les tablettes (en respectant les paramètres RTL). Vous pouvez utiliser ces valeurs pour le remplissage gauche et droit des éléments de liste. Puis 40dp réservés pour l'icône, l'espacement de 16dp et enfin le contenu.
Voici un carreau prêt à coller dans conception des matériaux pour une liste de trois lignes:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android = "http://schemas.Android.com/apk/res/Android"
xmlns:tools = "http://schemas.Android.com/tools"
Android:layout_width = "match_parent"
Android:layout_height = "88dp"
Android:layout_marginTop = "8dp"
Android:orientation = "vertical">
<ImageView
Android:id = "@+id/avatar"
Android:layout_width = "40dp"
Android:layout_height = "40dp"
Android:layout_marginBottom = "20dp"
Android:layout_marginLeft = "16dp"
Android:layout_marginRight = "16dp"
Android:layout_marginTop = "20dp"
Android:background = "@drawable/avatar"
Android:contentDescription = "Avatar"/>
<TextView
Android:id = "@+id/avatar_text"
Android:layout_width = "40dp"
Android:layout_height = "40dp"
Android:layout_marginBottom = "20dp"
Android:layout_marginLeft = "16dp"
Android:layout_marginRight = "16dp"
Android:layout_marginTop = "20dp"
Android:gravity = "center_vertical|center_horizontal"
Android:maxLines = "1"
Android:text = "AV"
Android:textColor = "@color/white_dark"
Android:textSize = "16sp"
Android:fontFamily="sans-serif"
Android:textStyle = "bold"/>
<LinearLayout
Android:layout_width = "match_parent"
Android:layout_height = "match_parent"
Android:layout_marginBottom = "16dp"
Android:layout_marginEnd = "56dp"
Android:layout_marginStart = "72dp"
Android:layout_marginTop = "16dp"
Android:orientation = "vertical">
<LinearLayout
Android:layout_width = "match_parent"
Android:layout_height = "wrap_content"
Android:orientation = "horizontal">
<TextView
Android:id = "@+id/first_line"
Android:layout_width = "wrap_content"
Android:layout_height = "wrap_content"
Android:layout_marginEnd = "16dp"
Android:ellipsize="Marquee"
Android:singleLine="true"
Android:text = "This is the title line"
Android:textColor = "@color/black_light"
Android:textSize = "16sp"
Android:fontFamily="sans-serif"/>
</LinearLayout>
<LinearLayout
Android:layout_width = "match_parent"
Android:layout_height = "wrap_content"
Android:orientation = "horizontal">
<TextView
Android:id = "@+id/second_line"
Android:layout_width = "wrap_content"
Android:layout_height = "wrap_content"
Android:ellipsize="Marquee"
Android:singleLine="true"
Android:textColor = "@color/discreet_dark"
Android:textSize = "14sp"
Android:fontFamily="sans-serif"
tools:text = "This is the second line"/>
</LinearLayout>
<LinearLayout
Android:layout_width = "match_parent"
Android:layout_height = "wrap_content"
Android:orientation = "horizontal">
<TextView
Android:id = "@+id/third_line"
Android:layout_width = "wrap_content"
Android:layout_height = "wrap_content"
Android:ellipsize="Marquee"
Android:singleLine="true"
Android:textColor = "@color/discreet_dark"
Android:textSize = "14sp"
Android:fontFamily="sans-serif"
tools:text = "This is the third line"/>
</LinearLayout>
</LinearLayout>
<TextView
Android:id = "@+id/minor_info"
Android:layout_width = "wrap_content"
Android:layout_height = "wrap_content"
Android:layout_alignParentEnd = "true"
Android:layout_marginEnd = "16dp"
Android:layout_marginTop = "20dp"
Android:maxLines = "1"
Android:maxWidth = "40dp"
Android:text = "19 min"
Android:textColor = "@color/discreet_dark"
Android:textSize = "12sp"
Android:fontFamily="sans-serif"/>
<ImageView
Android:id = "@+id/favourite"
Android:layout_width = "24dp"
Android:layout_height = "24dp"
Android:layout_alignParentBottom = "true"
Android:layout_alignParentEnd = "true"
Android:layout_marginBottom = "16dp"
Android:layout_marginLeft = "16dp"
Android:layout_marginRight = "16dp"
Android:contentDescription = "Favourite"
tools:src = "@drawable/favourite_checked"/>
<View
Android:layout_width = "match_parent"
Android:layout_height = "1dp"
Android:layout_alignParentBottom="true"
Android:layout_marginStart = "72dp"
Android:background = "@color/discreet_light"/>
</RelativeLayout>