如何在Android中使用数据绑定绑定layout_width和layout_height

时间:2016-01-18 20:43:19

标签: android xml data-binding android-databinding

我尝试绑定一个指示ImageView的布尔值,如果屏幕尺寸很小,那么如果我需要更多空间用于其他组件,它会收缩。我使用DataBinding Library来执行此操作。

我的布局,其宽度和高度取决于此布尔值:

...
<data>
    ...
    <variable name="smallScreen" type="boolean"/>
    ...
</data>
...
<ImageView
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}"
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}"
android:layout_gravity="center_horizontal"
android:contentDescription="@{message}"
android:src="@{image}"
android:scaleType="center"
tools:src="@drawable/img_message_private"/>
...

如果我只是尝试像这样构建我的项目,编译器说layout_width不能接受float类型。很公平,我使用BindingAdapter类为布局属性创建一个浮动输入,如下所示:

...
@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, float width) {
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
    layoutParams.width = (int) width;
    view.setLayoutParams(layoutParams);
}

@BindingAdapter("android:layout_height")
public static void setLayoutHeight(View view, float height) {
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
    layoutParams.height = (int) height;
    view.setLayoutParams(layoutParams);
}
...

这允许我的项目构建。但是当最终渲染布局时,我会遇到以下异常:

java.lang.RuntimeException: Binary XML file line #21: You must supply a layout_width attribute.

仅供参考,我的尺寸以dp为单位设置,如下所示:

<dimen name="img_small_screen_size">100dp</dimen>
<dimen name="img_big_screen_size">208dp</dimen>

有人知道如何覆盖layout_width属性,以便我可以使用维度直接使用数据绑定吗?

2 个答案:

答案 0 :(得分:6)

我在写完问题时想出来了。我只是使用另一个属性绑定我想要更改的那个,代码结束如下:

<ImageView
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}"
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}"
android:layout_gravity="center_horizontal"
android:contentDescription="@{message}"
android:src="@{image}"
android:scaleType="center"
tools:src="@drawable/img_message_private"/>

所以我的BindingAdapters成了这个:

@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, float width) {
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
    layoutParams.width = (int) width;
    view.setLayoutParams(layoutParams);
}

@BindingAdapter("android:layout_height")
public static void setLayoutHeight(View view, float height) {
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
    layoutParams.height = (int) height;
    view.setLayoutParams(layoutParams);
}

答案 1 :(得分:2)

您应该添加默认值,即

android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size, default=wrap_content}"