android - 数据绑定布局约束
问题描述
我在添加结束约束以查看时遇到问题
<android.support.constraint.ConstraintLayout
android:id="@+id/chatDocumentMessageContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@{chatMessage.corespondent==Corespondent.Sent? @drawable/very_rounded_corners_gray_background:@drawable/very_rounded_corners_orange_background}"
android:maxWidth="300dp"
android:minWidth="140dp"
android:onClick="@{clickListener::onClick}"
android:padding="@dimen/padding_large"
app:layout_constraintEnd_toEndOf="@{chatMessage.corespondent==Corespondent.Sent? ConstraintSet.PARENT_ID:ConstraintSet.UNSET}">
我收到了这个错误:
[kapt] 发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误。****/ 数据绑定错误 ****msg:在 android.support.constraint.ConstraintLayout 上找不到参数类型为 int 的属性“app:layout_constraintEnd_toEndOf”的设置器。
尝试添加以下适配器,但仍然无法正常工作:
@BindingAdapter(" app:layout_constraintEnd_toEndOf")
fun setEndConstraint(guideline: Guideline, resource: Int) {
val params = guideline.getLayoutParams() as ConstraintLayout.LayoutParams
params.endToEnd = resource
guideline.layoutParams = params
}
解决方案
我为这种情况创建了一个 BindingAdapter:
@BindingAdapter(
"layout_conditionalConstraint_startSide",
"layout_conditionalConstraint_toEndId",
"layout_conditionalConstraint_endSide",
"layout_conditionalConstraint_condition"
)
fun setConditionalConstraint(
view: View, startSide: Int, endId: Int, endSide: Int, condition: Boolean
) {
val constraintLayout = (view.parent as? ConstraintLayout) ?: return
with(ConstraintSet()) {
clone(constraintLayout)
if (condition) connect(view.id, startSide, endId, endSide)
else clear(view.id, startSide)
applyTo(constraintLayout)
}
}
在您的情况下,您可以像这样使用它:
<android.support.constraint.ConstraintLayout
android:id="@+id/chatDocumentMessageContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@{chatMessage.corespondent == Corespondent.Sent ? @drawable/very_rounded_corners_gray_background : @drawable/very_rounded_corners_orange_background}"
android:maxWidth="300dp"
android:minWidth="140dp"
android:onClick="@{clickListener::onClick}"
android:padding="@dimen/padding_large"
app:layout_conditionalConstraint_startSide="@{ConstraintSet.END}"
app:layout_conditionalConstraint_toEndId="@{ConstraintSet.PARENT_ID}"
app:layout_conditionalConstraint_endSide="@{ConstraintSet.END}"
app:layout_conditionalConstraint_condition="@{chatMessage.corespondent == Corespondent.Sent}">
但在大多数情况下,您应该能够使用 ConstraintLayout 提供的功能获得所需的布局,此 BindingAdapter 仅在少数极端情况或复杂布局中有用。
推荐阅读
- java - 如何使用三层架构和 SQL 服务器创建登录表单?
- android - 如何从 BroadcastReceiver 在 Activity 中发送和保存字符串消息
- javascript - 添加图像和更改屏幕尺寸时,HTML 表格单元格会变大;为什么?
- python - 如何将 BigQuery SQL 查询结果转换为 Spark DataFrame?
- c - %s 在 C 中无法正常使用我的返回值
- vb.net - 从 vb.net 中超过 7000 条记录的数据网格视图中检索行索引的替代有效方法是什么?
- android - 如何使用亚马逊等搜索框制作滚动工具栏
- c++ - 在 C++ 中,如何创建 int 的映射和当前映射的迭代器?
- oracle - 如何将数据从 spark 保存到谷歌云平台?
- c - 如何使用 g_idle_add() 获取窗口大小?