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

Posted

技术标签:

【中文标题】如何在 Android 中使用数据绑定来绑定 layout_width 和 layout_height【英文标题】:How to bind a layout_width and layout_height using data binding in Android 【发布时间】:2016-04-24 03:43:46 【问题描述】:

如果屏幕尺寸很小,我正在尝试绑定一个布尔值来指示 ImageView,因此如果我需要更多空间用于其他组件,它会缩小。我正在使用DataBinding Library 这样做。

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

...
<data>
    ...
    <variable name="smallScreen" type="boolean"/>
    ...
</data>
...
<ImageView
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:contentDescription="@message"
android:src="@image"
android:scaleType="center"
tools:src="@drawable/img_message_private"/>
...

如果我只是尝试像这样构建我的项目,编译器会说 layout_width 不能接​​受浮点类型。很公平,我使用 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 属性,以便我可以直接使用数据绑定,使用维度?

【问题讨论】:

【参考方案1】:

我只是在写问题时想通了。我只是用另一个属性绑定了我想改的,代码是这样结束的:

<ImageView
android:layout_
android:layout_
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);

【讨论】:

你也可以使用“android:layout_width”。您不必使用自己的命名空间。 现在你的答案看起来和问题一样【参考方案2】:

你应该添加一个默认值,即,

android:layout_

【讨论】:

谢谢。设置默认值解决了我的问题。但是我有一个疑问,默认值永远不会执行,第一个或第二个值都会运行那为什么默认值? 谢谢!您的帖子也对我有帮助! @Shubham 这一切都取决于操作何时将“smallScreen”变量实际绑定到布局。如果它晚于第一个布局传递,则会抛出上述错误。另外,请记住,如果您不想或可以使用适当的工具属性,则默认值可以非常方便地用于布局预览。

以上是关于如何在 Android 中使用数据绑定来绑定 layout_width 和 layout_height的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WPF 按钮的参数或绑定来更改 XAML 样式中的 fa 图标

Android 数据绑定 layout_width 和 layout_height

如何通过在 AngularJS 中绑定来捕获来自无效属性的 html 编译错误

动态生成元素的淘汰数据绑定

WPF 复选框绑定

使用 `let` 绑定来增加值的生命周期