如果值为true,则Android数据绑定设置填充

如果值为true,则Android数据绑定设置填充,android,android-layout,android-studio,android-databinding,Android,Android Layout,Android Studio,Android Databinding,如果布尔值为true,我希望能够设置填充值。问题是AndroidStudio无法解析布局,因为它认为2dp是一个值为2的十进制数,然后不知道如何处理p。我如何格式化它,使它理解我的意思是2密度像素 数据布局: <data class=".ItemBinding"> <variable name="isGroupType" type="Boolean"/> </data> 视图布局(重要事项): 将填充值存储在dimen.xml中并使用它。请保持使

如果布尔值为true,我希望能够设置填充值。问题是AndroidStudio无法解析布局,因为它认为2dp是一个值为2的十进制数,然后不知道如何处理p。我如何格式化它,使它理解我的意思是2密度像素

数据布局:

<data class=".ItemBinding">
    <variable name="isGroupType" type="Boolean"/>
</data>

视图布局(重要事项):


将填充值存储在
dimen.xml
中并使用它。请保持使用“”编写绑定字符串的习惯(双引号)


其他填充物也是如此。

正如一个提示,这不适用于
版面边距


不知道为什么,但我认为这是因为父布局需要重新测量。

@Ravi的答案是正确的

但为了获得更大的灵活性,您也可以尝试以下方法:

@BindingAdapter({"padding", "shouldAdd"})
public static void setPadding(AppCompatImageView imageView, boolean shouldAdd, int padding){
    if (shouldAdd){
        imageView.setPadding(padding, padding, padding, padding);
    }
}
然后:



@Ravi的答案是好的,但它只适用于填充。

如果只想添加边距,请创建空视图,例如带填充的文本视图。

对于希望通过数据绑定设置边距的任何人,您还必须使用
BindingAdapter

@BindingAdapter("layoutMarginBottom")
fun setLayoutMarginBottom(view: View, dimen: Float) {
    val layoutParams = view.layoutParams as MarginLayoutParams
    layoutParams.bottomMargin = dimen.toInt()
    view.layoutParams = layoutParams
}
您的xml属性将如下所示:

app:layoutMarginBottom="@{someCondition ? @dimen/zero_dp : @dimen/twenty_dp}"

您可以在xml绑定中使用逻辑和三元语句,但您确实不应该这样做。当您查看通常有逻辑但看不到发生了什么的地方时,它会再次困扰您。 BindingAdapter可满足您的所有保证金需求:

fun bindingSetMargins(view: View, start: Float?, top: Float?, end: Float?, bottom: Float?) {
    view.layoutParams = (view.layoutParams as ViewGroup.MarginLayoutParams).apply {
        start?.toInt()?.let { leftMargin = it }
        top?.toInt()?.let { topMargin = it }
        end?.toInt()?.let { rightMargin = it }
        bottom?.toInt()?.let { bottomMargin = it }
    }
}

将2dp替换为“2dp”。不起作用。在黑暗中拍摄:尝试过,
2\dp
或仅2?转义d没有帮助。尝试第二个选项。我认为当我刚放入2时,它将以像素为单位设置填充。我可能需要@BindingAdapterInteresting,还有一件事,我刚想到,将dp放在花括号外(但仍在引号内)为什么绑定应使用“”编写?如果使用“”,则可以在绑定内部使用“”。如果在两者之间编写,则反之亦然,您也可以在里面使用``。这只适用于
填充
而不适用于
边距
奇怪但真实。我确信我的某些配置不正确。感谢提醒。这是因为它无法解析dp。它只需要数字,在这种情况下我将更改为@BindingAdapter(“android:layout_marginBottom”),因此它可以在layout@JanuszHain是的,这是可以做到的,我个人更喜欢将数据绑定内容与android namespaceJava版本`@BindingAdapter(“android:layout_marginTop”)公共静态void setLayoutMarginTop(视图,浮动维度)分开{ViewGroup.MarginLayoutParams layoutParams=(ViewGroup.MarginLayoutParams)view.getLayoutParams();layoutParams.topMargin=dimen.intValue();}`接受的答案对我不起作用,但效果很好。感谢您提供了完整的答案。您通过放置layout和java代码为我节省了时间。非常感谢。。。。
@BindingAdapter("layoutMarginBottom")
fun setLayoutMarginBottom(view: View, dimen: Float) {
    val layoutParams = view.layoutParams as MarginLayoutParams
    layoutParams.bottomMargin = dimen.toInt()
    view.layoutParams = layoutParams
}
app:layoutMarginBottom="@{someCondition ? @dimen/zero_dp : @dimen/twenty_dp}"
fun bindingSetMargins(view: View, start: Float?, top: Float?, end: Float?, bottom: Float?) {
    view.layoutParams = (view.layoutParams as ViewGroup.MarginLayoutParams).apply {
        start?.toInt()?.let { leftMargin = it }
        top?.toInt()?.let { topMargin = it }
        end?.toInt()?.let { rightMargin = it }
        bottom?.toInt()?.let { bottomMargin = it }
    }
}