Lorsque je conçois une présentation, je centralise toutes les dimensions dans dimens.xml en raison de sujets liés à la facilité de maintenance. Ma question est de savoir si cela est correct ou non. Quelle serait la meilleure bonne pratique? Il y a très peu d'informations à ce sujet, rien. Je sais que c’est une bonne idée de centraliser toutes les chaînes d’une mise en page sur strings.xml, colors sur colors.xml. Mais à propos des dimensions?
Par exemple:
<TableLayout
Android:id="@+id/history_detail_rows_submitted"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/cebroker_history_detail_rows_border"
Android:collapseColumns="*">
<TableRow
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="@dimen/history_detail_rows_margin_vertical"
Android:background="@color/cebroker_history_detail_rows_background"
Android:gravity="center"
Android:paddingBottom="@dimen/history_detail_rows_padding_vertical"
Android:paddingLeft="@dimen/history_detail_rows_padding_horizontal"
Android:paddingRight="@dimen/history_detail_rows_padding_horizontal"
Android:paddingTop="@dimen/history_detail_rows_padding_vertical">
<TextView
Android:layout_width="match_parent"
Android:drawableLeft="@mipmap/ic_history_detail_submitted_by"
Android:drawablePadding="@dimen/history_detail_rows_textviews_padding_drawable"
Android:gravity="left|center"
Android:paddingRight="@dimen/history_detail_rows_textviews_padding"
Android:text="@string/history_detail_textview_submitted_by"
Android:textColor="@color/cebroker_history_detail_rows_textviews"
Android:textSize="@dimen/history_detail_rows_textviews_text_size" />
dimens.xml
Créez un nouveau fichier dimens.xml
en cliquant avec le bouton droit de la souris sur le dossier values
et en choisissant Nouveau> Fichier de ressources de valeurs. Écrivez dimens
pour le nom. (Vous pouvez également l'appeler dimen
ou dimensions
. Le nom n'a pas d'importance, seul le type de ressource dimen
qu'il inclura.)
Ajoutez un nom et une valeur dimen
.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="my_value">16dp</dimen>
</resources>
Les valeurs peuvent être dans dp
, px
ou sp
.
Utilisez la valeur en xml
<TextView
Android:padding="@dimen/my_value"
... />
ou en code
float sizeInPixels = getResources().getDimension(R.dimen.my_value);
dimens.xml
Merci à cette réponse pour plus d'idées.
Réutilisation de valeurs - Si vous devez utiliser la même dimension à plusieurs endroits dans votre application (par exemple, le remplissage de la structure d'activité ou un TextView textSize
), l'utilisation d'une seule valeur dimen
facilitera considérablement les ajustements ultérieurs. C’est la même idée que d’utiliser des styles et des thèmes.
Prise en charge de plusieurs écrans - Un remplissage de 8dp
peut sembler correct sur un téléphone, mais très mauvais sur une tablette 10 ". Vous pouvez créer plusieurs dimens.xml
à utiliser avec différents écrans. De cette manière, vous pouvez utiliser le paramètre 8dp
pour le téléphone et 64dp
pour la tablette. Pour créer un autre fichier dimens.xml
, cliquez avec le bouton droit de la souris sur votre dossier res
et choisissez Nouveau> Fichier de ressources de valeur. (voir cette réponse pour plus de détails)
Convenient dp
à px
conversion de code - Dans le code, vous devez généralement utiliser des valeurs en pixels. Cependant, vous devez toujours penser à la densité des périphériques et la conversion est agaçante à faire par programme. Si vous avez une valeur constante dp
, vous pouvez l'obtenir en pixels facilement comme ceci pour float
:
float sizeInPixels = getResources().getDimension(R.dimen.my_value);
ou ceci pour int
:
int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_value);
Je donne beaucoup plus de détails sur la façon de faire ces choses dans ma réponse plus complète .
dimens.xml
Ne mettez pas vos valeurs dans dimens.xml
si cela va les rendre plus difficiles à maintenir. Généralement, ce sera chaque fois que cela ne tombe pas dans les catégories que j'ai énumérées ci-dessus. L'utilisation de dimens.xml
rend le code plus difficile à lire car vous devez basculer entre deux fichiers pour voir quelles sont les valeurs réelles. Ce n'est pas la peine (à mon avis) pour des vues individuelles.
Les cordes sont différentes. Toutes les chaînes doivent figurer dans un fichier de ressources tel que strings.xml
, car presque toutes les chaînes doivent être traduites lors de l'internationalisation de votre application. En revanche, la plupart des valeurs de dimension n'ont pas besoin de changer pour une localité différente. Android Studio semble soutenir ce raisonnement. Définir une chaîne directement dans la mise en page xml donnera un avertissement, mais définir une valeur dp
ne le fera pas.
ajoutez un fichier xml dimens.xml à utiliser pour prendre en charge plusieurs périphériques.
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="iconarrow">1dp</dimen>
<item name="text_view_padding" type="integer">100</item>
</resources>
alors vous pouvez l'utiliser dans votre code comme celui-ci en code Java
textview.setPadding(0, 0, 0, getResources().getInteger(R.integer.text_view_padding));
Vous pouvez également utiliser dans une autre mise en page (fichier XML).
Android:padding="@dimen/text_view_padding"
@ Jesús Castro Vous le faites bien. Il est préférable de conserver les valeurs dans le fichier dimens.xml plutôt que d'insérer des valeurs codées en dur dans tous vos fichiers de présentation.
Par exemple, imaginons le cas où vous augmentez les marges gauche et droite dans toutes vos vues. Si vous utilisiez une valeur unique conservée dans dimens.xml, cela constituerait un changement rapide - une valeur unique dans un seul fichier. Cependant, si vous aviez placé les valeurs de marge sous forme de valeurs littérales telles que "16dp" dans vos fichiers de mise en page est sujet aux erreurs et prend du temps.
vous n'avez pas besoin de mentionner la valeur dimen dans le fichier de dossier value. cette bibliothèque auto gère toutes les choses que vous appelez comme ça
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:paddingBottom="@dimen/_20sdp"
Android:paddingLeft="@dimen/_20sdp"
Android:paddingRight="@dimen/_20sdp"
Android:paddingTop="@dimen/_20sdp"
Android:background="@color/colorPrimary"
Android:orientation="vertical"
>
But about dimensions?
Selon les documents officiels Android "Une dimension est une ressource simple qui est référencée à l'aide de la valeur fournie dans l'attribut name
(et non du nom du fichier XML). Vous pouvez ainsi combiner des ressources de dimension avec d'autres ressources simples dans l'un fichier, sous un élément <resources>
"
Pour plus de détails, consultez http://developer.Android.com/guide/topics/resources/more-resources.html
Dans cet article, Devunwired donne trois bonnes raisons pour lesquelles utiliser dimens.xml Quand le fichier dimens.xml doit-il être utilisé dans Android?