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"
>
现在将此视图约束到您要控制 的可见性的布局。
现在根据情况消失此视图。与边距相同
我希望能够在布尔值为真时设置填充值。问题是 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"
>
现在将此视图约束到您要控制 的可见性的布局。 现在根据情况消失此视图。与边距相同