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