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

Android databinding set padding if value is true

我希望能够在布尔值为真时设置填充值。问题是 Android studio 无法解析布局,因为它认为 2dp 是一个值为 2 的小数,然后不知道如何处理 p。我该如何格式化它才能理解我的意思是 2 个密度像素。

数据布局:

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

查看布局(重要的是):

<android.support.v7.widget.AppCompatImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:paddingBottom='@{isGroupType ? 2dp : 0dp}'
            android:paddingTop='@{isGroupType ? 8dp : 0dp}'
            android:paddingRight='@{isGroupType ? 2dp : 0dp}'
            android:paddingLeft='@{isGroupType ? 2dp : 0dp}'/>

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

android:paddingBottom="@{isGroupType ? @dimen/padding_normal : @dimen/padding_null}"

其他填充也依此类推。

请注意,这不适用于 layout_margin 的 :(

不知道为什么,但认为这是由于父布局需要重新测量..

@Ravi 的回答是正确的。

但为了更灵活,您也可以试试这个:

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

然后:

<android.support.v7.widget.AppCompatImageView
        android:layout_width="64dp"
        android:layout_height="64dp"
        shouldAdd="@{isGroupType}"
        padding="@{10}"/>

@Ravi 的回答很好,但它仅适用于填充。 如果您只想添加边距,请创建空视图,例如带填充的 TextView。

对于希望通过 DataBinding 设置边距的任何人,您还必须使用 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-binding 中使用逻辑和三元语句,但实际上不应该。当你正在寻找你有逻辑但看不到发生了什么的平常地方时,它会回来困扰你。 满足您所有保证金需求的 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 }
    }
}

使用空白视图

<View
android:layout_width = "8dp"
android:layout_height = "8dp"
>

现在将此视图约束到您要控制 的可见性的布局。 现在根据情况消失此视图。与边距相同