如何连接包含在不同协调器布局容器中的约束布局中的视图?
How to connect views in constraint layout that holds in different containers of coordinator layout?
我有一个具有 CoordinatorLayout
类型主布局的片段
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/secondContainer"
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"/>
<include
android:id="@+id/mainContainer"
layout="@layout/view_home_content"
app:layout_anchorGravity="bottom"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
所以在主容器内我有两个独立的布局。第一个
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/topContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/topButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
还有最后一个
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/bottomContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/bottomText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
所以我的主要目标是使带有 id topButton
的视图约束到 bottomText
的底部。我试图以编程方式制作它,如果它们在同一个 xml 文件中,它工作正常,但是当它们像我上面显示的那样分开时,它不起作用
以下是我如何以编程方式连接它们
with(binding.topContainer) {
topContainer = topContainer
button = topButton
}
with(binding.bottomContainer) {
text = bottomText
}
val mConstraintSet = ConstraintSet()
mConstraintSet.clone(topContainer)
mConstraintSet.clear(R.id.topButton, ConstraintSet.TOP)
mConstraintSet.connect(R.id.topButton, ConstraintSet.TOP, R.id.bottomText, ConstraintSet.BOTTOM)
mConstraintSet.applyTo(topContainer)
正如我之前所说,如果我使用一个文件中的布局 ID,它就可以工作。但是这样他们好像看不到对方
预计在使用两个单独的文件时它不会起作用。要使用约束,您需要将所需的视图放在相同的约束布局中。您有一个 ConstraintLayout 用于底部,另一个用于顶部。您可以尝试在 coordinatorLayout 中放置一个 ConstraintLayout,并尝试将约束放入 include 标签中。
我有一个具有 CoordinatorLayout
类型主布局的片段
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/secondContainer"
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"/>
<include
android:id="@+id/mainContainer"
layout="@layout/view_home_content"
app:layout_anchorGravity="bottom"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
所以在主容器内我有两个独立的布局。第一个
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/topContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/topButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
还有最后一个
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/bottomContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/bottomText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
所以我的主要目标是使带有 id topButton
的视图约束到 bottomText
的底部。我试图以编程方式制作它,如果它们在同一个 xml 文件中,它工作正常,但是当它们像我上面显示的那样分开时,它不起作用
以下是我如何以编程方式连接它们
with(binding.topContainer) {
topContainer = topContainer
button = topButton
}
with(binding.bottomContainer) {
text = bottomText
}
val mConstraintSet = ConstraintSet()
mConstraintSet.clone(topContainer)
mConstraintSet.clear(R.id.topButton, ConstraintSet.TOP)
mConstraintSet.connect(R.id.topButton, ConstraintSet.TOP, R.id.bottomText, ConstraintSet.BOTTOM)
mConstraintSet.applyTo(topContainer)
正如我之前所说,如果我使用一个文件中的布局 ID,它就可以工作。但是这样他们好像看不到对方
预计在使用两个单独的文件时它不会起作用。要使用约束,您需要将所需的视图放在相同的约束布局中。您有一个 ConstraintLayout 用于底部,另一个用于顶部。您可以尝试在 coordinatorLayout 中放置一个 ConstraintLayout,并尝试将约束放入 include 标签中。