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

时间:2016-05-27 15:36:04

标签: android android-layout android-studio android-databinding

如果布尔值为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}'/>

6 个答案:

答案 0 :(得分:12)

将填充值存储在dimen.xml中并使用它。请保持习惯用&#34; &#34; (双引号)

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

以及其他填充等等。

答案 1 :(得分:3)

请注意,layout_margin的:(

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

答案 2 :(得分:2)

@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}"/>

答案 3 :(得分:1)

对于希望通过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="@{item.shouldShowSkipOption ? @dimen/zero_dp : @dimen/twenty_dp}"

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以在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 }
    }
}