2011-11-11 8 views
41

¿Cómo puedo evitar este matemáticas codificado ...¿Cómo aplico operaciones matemáticas a las dimensiones de 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" /> 

... y encubierta por algo como esto?

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

Honestamente, me gustaría que Android tuviera esa funcionalidad. Podría ser una cosa menos para mantener –

+0

2016 y aún no existe –

Respuesta

26

Usted no, lo siento. Los archivos de diseño XML no admiten expresiones. Que o bien:

  • dejarlo como @dimen/uno_plus_dos o
  • ajustar los márgenes en código Java, donde se puede reemplazar un solo recurso con un montón de líneas adicionales de código, o
  • escribe su propio preprocesador diseño que maneja expresiones como esta

ACTUALIZACIÓN El data binding library apoya algunas operaciones en sus expresiones. No estoy seguro de si puede manejar este escenario específico.

+3

¿Alguien ha intentado escribir su propio analizador de diseño de Android (con suerte de código abierto)? – Supuhstar

1

Hay algunos trucos al respecto, pero no sería tan bueno como su solución propuesta, que es algo que también quiero. Por ejemplo, puede usar los rellenos de diseño no solo en la Vista (botón en este caso), sino que también puede hacerlo en el elemento primario de la vista (el diseño como LinearLayout/RelativeLayout). También puede colocar Vistas invisibles (un objeto de Vista recta funciona con frecuencia) con dimensiones fijas. Sería como

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

Tenga en cuenta que 1 píxel está muy bien si queremos garantizar a sólo 1 píxel será dibujado para una dimensión, que suele ser lo que quiera si desea utilizar vistas vacíos para el relleno. Algunos dicen que FrameLayout es mejor para el relleno vacío, pero que desciende de Ver

A veces se puede combinar relleno y el relleno de diseño, pero eso puede ser complicado y tener su vista recortada. También puede tener algo como un FrameLayout o un LinearLayout que contenga solo esa vista, y usar eso para tener el relleno adicional

14

Un truco para una simple adición es usar margen + relleno.

+2

inteligente :) lo hizo por mí, thx – muetzenflo

4

El uso de enlace de datos:

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

IFAIK márgenes adaptadores no son proporcionados por el SDK. Usted tendrá que definir por sí mismo:

@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); 
} 

Asegúrese de enlace de datos está habilitada para su proyecto:

dataBinding { 
    enabled = true 
} 

en su build.gradle.

Vale la pena leer el databinding doc.

+0

¿Quisiste decir que esto es un método setBottomMargin() ya que su param y la lógica son para el final de la Margen? – jk7

Cuestiones relacionadas