2011-11-11 8 views
41

Comment puis-je éviter ces calculs ... hardcodedComment appliquer des opérations mathématiques aux dimensions Android?

<resources> 
<dimen name="uno">10dip</dimen> 
<dimen name="dos">6dip</dimen> 
<dimen name="uno_plus_dos">16dip</dimen> 
</resources> 

<Button 
android:layout_marginTop="@dimen/uno_plus_dos" /> 

... et secrète à quelque chose comme ça?

<Button 
android:layout_marginTop="@dimin/uno + @dimen/dos" /> 
+11

Je souhaite sincèrement qu'Android ait cette fonctionnalité. Il pourrait être une chose de moins à maintenir –

+0

2016 et toujours pas là –

Répondre

26

Pas vous, désolé. Les fichiers XML de mise en page ne prennent pas en charge les expressions. Soit vous:

  • congé comme @dimen/uno_plus_dos ou
  • Définissez vos marges dans le code Java, où vous pouvez remplacer une seule ressource avec un tas de lignes de code supplémentaires, ou
  • Rédigez votre propre mise en page préprocesseur qui gère des expressions comme celui-ci

MISE à JOUR Ledata binding library prend en charge certaines opérations dans ses expressions. Je ne suis pas certain de pouvoir gérer ce scénario spécifique.

+3

Quelqu'un at-il essayé d'écrire leur propre analyseur de mise en page Android (espérons-le open-source)? – Supuhstar

1

Il y a quelques trucs autour de cela, mais ce ne serait pas aussi bien que votre solution proposée, ce que je veux aussi. Par exemple, vous pouvez utiliser des paddings de mise en page non seulement sur la vue (bouton dans ce cas), mais vous pouvez également le faire sur le parent de la vue (la disposition comme LinearLayout/RelativeLayout). Vous pouvez également mettre des vues invisibile (un objet View droit fonctionne souvent) avec des dimensions fixes. Ce serait comme

<View 
    android:layout_width="1px" 
    andoird:layout_height="@dimen/dos" /> 

Notez que 1px est très bien si vous voulez garantir que 1 pixel sera établi pour une dimension, ce qui est généralement ce que vous voulez si vous voulez utiliser des vues vides pour le rembourrage. Certains disent que FrameLayout est préférable d'utiliser pour le rembourrage vide, mais cela est descendu de View

Parfois, vous pouvez combiner le rembourrage et le rembourrage de mise en page, mais cela peut être salissant et avoir votre vue recadrée. Vous pouvez aussi avoir quelque chose comme un FrameLayout ou un LinearLayout qui contiennent juste cette vue, et l'utiliser pour avoir le remplissage ajouté

14

Une astuce pour l'ajout simple est d'utiliser margin + padding.

+2

intelligent :) l'a fait pour moi, thx – muetzenflo

4

En utilisant la liaison de données:

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

marges IFAIK adaptateurs ne sont pas fournis par le sdk. Vous devez 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 databinding est activé pour votre projet:

dataBinding { 
    enabled = true 
} 

dans votre build.gradle. Le databinding doc vaut la peine d'être lu.

+0

Voulez-vous dire que c'est une méthode setBottomMargin() puisque son param et sa logique sont pour bottomMargin? – jk7

Questions connexes