我在回收者视图的视图持有者中使用数据绑定。为了显示一个非活动行,我将前景设置为一种颜色,这在我的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代码而不是数据绑定来解决它。有任何建议如何通过数据绑定解决它?
答案 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);
}