Comment appliquer des opérations mathématiques aux dimensions Android?

Comment puis-je éviter ces maths codés …

 10dip 6dip 16dip  

… et le convertir en quelque chose comme ça?

 

Vous ne le faites pas, désolé. Les fichiers XML de mise en page ne prennent pas en charge les expressions. Toi non plus:

  • Laissez-le comme @dimen/uno_plus_dos , ou
  • Définissez vos marges en code Java, où vous pouvez remplacer une seule ressource par un groupe de lignes de code supplémentaires, ou
  • Ecrivez votre propre préprocesseur de mise en page qui gère des expressions comme celle-ci

UPDATE La bibliothèque de liaison de données prend en charge certaines opérations dans ses expressions. Je ne sais pas si elle peut gérer ce scénario spécifique.

Une astuce pour l’addition simple consiste à utiliser margin + padding.

Utilisation de la liaison de données:

 android:layout_marginTop="@{@dimen/uno + @dimen/dos}" 

Les adaptateurs de marge IFAIK ne sont pas fournis par le SDK. Vous devrez le définir vous-même:

 @BindingAdapter("android:layout_marginTop") public static void setBottomMargin(View view, int bottomMargin) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, bottomMargin); view.setLayoutParams(layoutParams); } 

Assurez-vous que la liaison de données est activée pour votre projet:

 dataBinding { enabled = true } 

dans votre build.gradle .

La doc de liaison de données mérite d’être lue.

Il y a quelques astuces à ce sujet, mais ce ne serait pas aussi bien que votre solution proposée, ce que je veux aussi. Par exemple, vous pouvez utiliser des remplissages de présentation non seulement pour la vue (Button dans ce cas), mais vous pouvez également le faire sur le parent de la vue (la disposition telle que LinearLayout / RelativeLayout). Vous pouvez également placer des vues invisibles (un object View droit fonctionne souvent) avec des dimensions fixes. Ce serait comme

  

Notez que 1px est correct si vous souhaitez garantir que 1 pixel seulement sera dessiné pour une dimension, ce qui est généralement ce que vous voulez si vous souhaitez utiliser des vues vides pour le remplissage. Certains disent que FrameLayout est préférable d’utiliser un remplissage vide, mais que cela découle de View

Parfois, vous pouvez combiner le remplissage et le remplissage de la mise en page, mais cela peut être compliqué et votre vue est tronquée. Vous pouvez également avoir quelque chose comme un FrameLayout ou un LinearLayout contenant uniquement cette vue, et l’utiliser pour avoir le remplissage ajouté.