【问题标题】:Databinding layout constraints数据绑定布局约束
【发布时间】:2018-11-28 08:00:10
【问题描述】:

在视图中添加结束约束时遇到问题

 <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:找不到参数类型为 int 的属性“app:layout_constraintEnd_toEndOf”的设置器 android.support.constraint.ConstraintLayout.

尝试添加以下适配器,但仍然无法正常工作:

 @BindingAdapter(" app:layout_constraintEnd_toEndOf")
    fun setEndConstraint(guideline: Guideline, resource: Int) {
        val params = guideline.getLayoutParams() as ConstraintLayout.LayoutParams
        params.endToEnd = resource
        guideline.layoutParams = params
    }

【问题讨论】:

  • 尝试改变这个应用:layout_constraintEnd_toEndOf="parent"
  • 不要这样做。我不会回答您的问题,因为您尝试做的是一种不好的做法。不要那样做。
  • @ArchieG.Quiñones 为什么会这样。我想删除多余的布局。
  • 代码不可测试。您的布局应该是愚蠢的,没有添加任何逻辑。您可以通过将该逻辑放在单独的类中而不是将它们本身放在布局中来轻松地做同样的事情。同样,这就是我认为您的问题不值得回答的原因。

标签: android android-constraintlayout android-databinding


【解决方案1】:

我为这种情况创建了一个 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 仅在少数极端情况或复杂布局中有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多