【问题标题】:Arithmetic operations in layout - Android Data Binding布局中的算术运算 - Android 数据绑定
【发布时间】:2016-11-23 15:05:15
【问题描述】:

我正在尝试在数据绑定中使用算术运算:

<Space
    android:layout_width="match_parent"
    android:layout_height="@{2 * @dimen/button_min_height}" />

不幸的是,我得到了:

Error:(47, 47) must be able to find a common parent for int and float 

有什么想法吗?

【问题讨论】:

  • 我认为您可以使用BindingAdapter 来实现这一点,它使用layout_heightfactor。我不知道它是否“开箱即用”...

标签: android android-layout android-databinding


【解决方案1】:

您应该以编程方式执行此操作。在您的 xml 文件中,将 android:id 属性添加到您的 Space 视图中:

<Space
    android:id="@+id/space"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在你的 Java 类中你应该写这个:

Space space = findViewById(R.id.space);
space.getLayoutParams().height = 2 * getResources().getDimension(R.dimen.button_min_height);
space.requestLayout();

【讨论】:

  • 我知道我可以。但我的问题是关于数据绑定的。
【解决方案2】:

因为您正在执行int * float 操作,所以2 是int 值,@dimen/button_min_height 将为您提供float 值。但是android:layout_height 将只接受float 值。

您可以像这样创建自定义绑定方法:

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

在你的 xml 代码中

android:layout_height="@{(float)2 * @dimen/activity_vertical_margin}"

将 2 转换为 float,这样它就不会出现任何转换错误。

从上面的代码你会得到RunTimeException : You must supply a layout_height attribute.,为了解决这个错误,提供default值给layout_height

android:layout_height="@{(float)2 * @dimen/activity_vertical_margin, default=wrap_content}"

default属性概念参考this官方文档,也可以参考this answer

【讨论】:

  • 不幸的是:android:layout_height="@{(float)2 * @dimen/button_min_height, default=wrap_content}" 我得到:找不到属性'android:layout_height'的设置器参数类型浮动在 android.widget.Space.
  • 你声明BindingAdapter方法了吗?
  • 忘记重建。现在正在工作!我决定将 dimen 转换为 int,因为 ViewGroup.LayoutParams.height 是 int。您是否可以考虑编辑您的答案,或者有理由选择浮动?
  • 两者都可以,但由于layout_height 接受浮点值,我没有改变。如果我们保持默认行为不变,那就更好了。否则选择是你的:)
猜你喜欢
  • 1970-01-01
  • 2017-04-08
  • 2011-06-07
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多