Как применить математические операции к измерениям Android? - PullRequest
45 голосов
/ 12 ноября 2011

Как мне избежать этой жестко запрограммированной математики ...

<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" />

... и скрыть что-то вроде этого?

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

Ответы [ 4 ]

29 голосов
/ 12 ноября 2011

Ты не извини.XML-файлы макета не поддерживают выражения.Вы либо:

  • Оставьте его как @dimen/uno_plus_dos, либо
  • Установите поля в коде Java, где вы можете заменить один ресурс кучей дополнительных строк кода, или
  • Напишите свой собственный препроцессор макета, который обрабатывает такие выражения как

ОБНОВЛЕНИЕ Библиотека привязки данных поддерживает некоторые операции в своих выражениях.Я не уверен, сможет ли он справиться с этим конкретным сценарием.

16 голосов
/ 04 марта 2015

Один трюк для простого добавления заключается в использовании поля + отступы.

7 голосов
/ 26 января 2017

Использование привязки данных:

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

Адаптеры полей IFAIK не предоставляются SDK.Вам нужно определить его самостоятельно:

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

Убедитесь, что привязка данных включена для вашего проекта:

dataBinding {
    enabled = true
}

в вашем build.gradle .

Документ для привязки данных стоит прочитать.

1 голос
/ 10 июня 2013

Вокруг этого есть несколько хитростей, но это не так хорошо, как предложенное вами решение, чего я тоже хочу. Например, вы можете использовать отступы макета не только для представления (в данном случае Button), но вы также можете сделать это для родителя представления (макет, такой как LinearLayout / RelativeLayout). Вы также можете вставить невидимые виды (часто работает прямой объект) с фиксированными размерами. Это было бы похоже на

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

Обратите внимание, что 1px это хорошо, если вы хотите гарантировать, что для измерения будет нарисован только 1 пиксель, что обычно является тем, что вы хотите, если вы хотите использовать пустые представления для заполнения. Некоторые говорят, что FrameLayout лучше использовать для пустого заполнения, но это происходит от View

Иногда вы можете комбинировать отступы и отступы макета, но это может стать грязным и привести к обрезке вашего вида. Также вы можете иметь что-то вроде FrameLayout или LinearLayout, содержащее только это представление, и использовать его для добавления дополнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...