Подтвердить что ты не робот

Как применить математические операции к размерам 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" />

... и скрывает его до такого?

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

Ответ 1

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

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

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

Ответ 2

Один трюк для простого добавления - использовать margin + padding.

Ответ 3

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

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.

databinding doc стоит прочитать.

Ответ 4

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

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

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

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