使用数据绑定的前台在某些设备中不起作用

时间:2017-02-11 08:10:39

标签: android android-databinding

我在回收者视图的视图持有者中使用数据绑定。为了显示一个非活动行,我将前景设置为一种颜色,这在我的Nexus6和许多其他设备上都很完美。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:foreground="@{subscribed.isAutoRenew() ? @color/transparent : @color/bg_inactive}">
        other stuff ...
</RelativeLayout>

问题是这个代码不适用于Android 5.0的三星SM-N900。我可以通过使用java代码而不是数据绑定来解决它。有任何建议如何通过数据绑定解决它?

1 个答案:

答案 0 :(得分:1)

数据绑定可以避免旧平台上不存在的方法调用。如果您正在测试的设备早于API 23(Marshmallow),那么它将拒绝拨打setForeground()。数据绑定没有一种神奇的方法来为RelativeLayout提供前台功能,因此您必须执行您在Java代码中所做的操作。为您的布局提供一个FrameLayout包装器,并为其分配前景。

<FrameLayout ... 
    android:foreground="@{subscribed.isAutoRenew() ? @color/transparent : @color/bg_inactive}">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
    other stuff ...
    </RelativeLayout>
</FrameLayout>

- 编辑 -

根据评论,我必须得出结论,数据绑定中必定存在一个错误,它会检测到View.setForeground()的版本并发现它是API 23,所以跳过它。它一定不能检查FrameLayout.setForegound()。我会在此提出错误。

同时,您可以通过创建自己的BindingAdapter来解决它:

@BindingAdapter("android:foreground")
public static void setForeground(FrameLayout view, Drawable drawable) {
    view.setForeground(drawable);
}