Ширина привязки данных Android с троичным с использованием dp в XML
Я знаю, что могу использовать @ измерение / что-то... но мне было интересно, почему это не работает и как заставить его работать. Поможет мне понять черный ящик анализатора привязки данных.
В моем XML для элемента lineralayout:
android:layout_width="@{DataBoundData.dis.equals(IN_PROGRESS) ? 60dp :
(DataBoundData.dis.equals(POSTED) ? 60dp : 0dp)}"
Это показывает ошибку на "р" в 60dp. Я пробовал 60d\p 60dp
и несколько других и ничего не работает
1 ответ
Чтобы ответить на вопрос, почему android:layout_width="@{60dp}"
не работает, это потому, что привязка данных не понимает концепцию "dp".
Вы уже создали какой-то BindingAdapter для атрибута, иначе он не будет работать вообще, потому что layout_width
не поддерживается по умолчанию. Может быть, у вас есть что-то вроде этого:
@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, float width) {
LayoutParams layoutParams = view.getLayoutParams();
layoutParams.width = (int)width;
view.setLayoutParams(layoutParams);
}
На BindingAdapter нет указаний на то, что float width
является. У него нет типа, поэтому нет возможности передать эти знания константам в системе привязки данных. Это та же самая причина, по которой вы должны использовать
android:visibility="@{View.INVISIBLE}"
вместо
android:visibility="@{invisible}"
Там нет константы Java invisible
в контексте установки значения INT на setVisibility()
Вы можете передать целочисленную константу как 60
и это назначит это. К сожалению, это пиксели для LayoutParams, которые меняются между устройствами.
Когда вы используете @dimen/someDimension
Привязка данных преобразует измерение в число с плавающей точкой во время извлечения значения из ресурсов. Это легко понять, потому что Resources.getDimension()
возвращает float
, Точно так же, Resources.getColor()
возвращает целое число, поэтому каждый раз, когда вы передаете цветовой ресурс, вы передаете целое число.
Надеюсь, это поможет.