Я создал 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 полезен только в нескольких угловых случаях или сложных макетах.