Android布局问题:调整creatorEditorContainer至closeButton下方
解决ConstraintLayout中RecyclerView GONE时Editor容器居中的布局问题
问题回顾
你当前遇到的问题是:当peopleList(RecyclerView)设为View.GONE时,creatorEditorContainer因为被设置为layout_height="0dp"且底部约束到已隐藏的RecyclerView,导致它被拉伸到屏幕中间,无法紧贴closeButton下方显示。
功能需求确认
- 同一屏幕内包含EditText和RecyclerView,点击@人图标时,RecyclerView需从
tagPlaceholder顶部弹出并扩展至creatorContainer所在的creatorEditorContainer底部; - 当RecyclerView的visibility设为
View.GONE时,creatorContainer需紧邻closeButton显示。
解决方案
我们需要调整creatorEditorContainer和peopleList的约束及高度设置,具体修改点如下:
1. 修复creatorEditorContainer的定位问题
- 将
layout_height从0dp改为wrap_content:NestedScrollView本身是用来包裹可滚动内容的,设置为wrap_content可以让它根据内部内容自适应高度,避免被不必要的约束拉伸; - 移除
app:layout_constraintBottom_toTopOf="@id/peopleList":当RecyclerView隐藏时,这个约束会失效,导致容器的底部没有锚点,进而被拉伸; - 添加
app:layout_constraintBottom_toTopOf="@id/tagPlaceholder":让容器底部锚定到tagPlaceholder的顶部,这样无论RecyclerView是否显示,容器都能保持在正确的位置,紧贴closeButton下方。
2. 调整RecyclerView的弹出约束
- 将
peopleList的layout_height设为0dp:这样当它显示时,会自动填充creatorEditorContainer底部到tagPlaceholder顶部的整个空间,满足"从tagPlaceholder顶部弹出并扩展至creatorEditorContainer底部"的需求; - 保留
app:layout_constraintTop_toBottomOf="@id/creatorEditorContainer"和app:layout_constraintBottom_toTopOf="@id/tagPlaceholder"这两个约束,确保显示时的正确拉伸范围; - 保持默认
visibility="gone",点击@图标时动态切换为visible即可。
修改后的完整布局代码
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" > <androidx.appcompat.widget.AppCompatImageButton android:id="@+id/closeButton" android:layout_width="@dimen/margin_48" android:layout_height="@dimen/margin_48" android:background="@android:color/white" android:paddingEnd="@dimen/margin_zero" android:paddingStart="@dimen/margin_small" android:paddingTop="@dimen/margin_small" android:src="@drawable/ic_close" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/screenTitle" android:layout_width="@dimen/margin_zero" android:layout_height="wrap_content" android:text="@string/label_create_post" android:textAppearance="@style/SubtitleAppearance" android:textColor="@android:color/black" android:textSize="@dimen/text_large" app:layout_constraintBottom_toBottomOf="@id/closeButton" app:layout_constraintEnd_toStartOf="@id/submitPost" app:layout_constraintStart_toEndOf="@id/closeButton" app:layout_constraintTop_toTopOf="@id/closeButton" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/submitPost" android:layout_width="@dimen/margin_48" android:layout_height="@dimen/margin_huge" android:layout_marginEnd="@dimen/margin_larger" android:layout_marginStart="@dimen/margin_larger" android:text="@string/label_post" app:layout_constraintBottom_toBottomOf="@id/screenTitle" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/screenTitle" style="@style/PrimaryButton" /> <androidx.core.widget.NestedScrollView android:id="@+id/creatorEditorContainer" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/closeButton" android:layout_marginTop="@dimen/margin_big" app:layout_constraintBottom_toTopOf="@id/tagPlaceholder" app:layout_behavior="@string/appbar_scrolling_view_behavior" > <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/creatorContainer" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="@dimen/margin_medium" android:paddingBottom="@dimen/margin_medium" > <androidx.appcompat.widget.AppCompatImageView android:id="@+id/postCreatorImage" android:layout_width="@dimen/margin_40" android:layout_height="@dimen/margin_40" android:layout_marginStart="@dimen/margin_larger" android:src="@drawable/ic_man" tools:src="@drawable/ic_man" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <androidx.appcompat.widget.AppCompatTextView android:id="@+id/creatorName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/margin_big" android:textAppearance="@style/SubtitleAppearance" android:textColor="@android:color/black" android:text="Name" tools:text="Mahesh Nandam" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/creatorDesignation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/margin_big" android:textColor="@color/colorTextGrey" android:text="peopleDesignation" tools:text="Senior Development Engineer" style="@style/BodyAppearanceRegular" /> </LinearLayout> </LinearLayout> <androidx.appcompat.widget.AppCompatEditText android:id="@+id/feedInput" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/margin_15" android:background="@android:color/white" android:gravity="top" android:hint="@string/compose_hint" android:paddingEnd="@dimen/margin_larger" android:paddingStart="@dimen/margin_larger" android:textAppearance="@style/BodyAppearanceRegular" android:textColor="@color/colorTextGrey" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/creatorContainer" android:textSize="@dimen/text_medium" tools:text="Calling all ML and AI enthusiasts." /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.core.widget.NestedScrollView> <androidx.recyclerview.widget.RecyclerView android:visibility="gone" android:id="@+id/peopleList" android:layout_width="match_parent" android:layout_height="0dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toTopOf="@id/tagPlaceholder" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/creatorEditorContainer" tools:itemCount="7" tools:listitem="@layout/item_people_profile_meta" app:adapter="@{fragFeedViewModel.getAdapterPeopleListAdapter()}" /> <androidx.appcompat.widget.AppCompatEditText android:id="@+id/tagPlaceholder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@" android:gravity="end" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:textAppearance="@style/BodyAppearanceRegular" android:textSize="@dimen/text_medium" android:background="@android:color/transparent" android:paddingTop="@dimen/margin_14" android:paddingBottom="@dimen/margin_14" android:paddingStart="@dimen/margin_larger" android:paddingEnd="@dimen/margin_zero" /> <androidx.appcompat.widget.AppCompatEditText android:id="@+id/tagInput" android:layout_width="@dimen/margin_zero" android:layout_height="wrap_content" app:layout_constraintStart_toEndOf="@id/tagPlaceholder" app:layout_constraintTop_toTopOf="@id/tagPlaceholder" app:layout_constraintBottom_toBottomOf="@id/tagPlaceholder" app:layout_constraintEnd_toStartOf="@id/cameraBtn" android:paddingTop="@dimen/margin_14" android:paddingBottom="@dimen/margin_14" android:hint="@string/hint_tag" android:background="@android:color/white" android:textAppearance="@style/BodyAppearanceRegular" android:textSize="@dimen/text_medium" android:textColor="@android:color/black" android:layout_marginStart="@dimen/margin_small"/> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/cameraBtn" android:layout_width="@dimen/margin_24" android:layout_height="@dimen/margin_24" android:paddingStart="@dimen/margin_big" android:paddingEnd="@dimen/margin_big" android:paddingTop="@dimen/margin_14" android:paddingBottom="@dimen/margin_14" app:layout_constraintStart_toEndOf="@id/tagInput" app:layout_constraintTop_toTopOf="@id/tagInput" app:layout_constraintBottom_toBottomOf="@id/tagInput" app:layout_constraintEnd_toStartOf="@id/galleryBtn" android:src="@drawable/ic_camera"/> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/galleryBtn" android:layout_width="@dimen/margin_24" android:layout_height="@dimen/margin_24" app:layout_constraintEnd_toEndOf="parent" android:paddingStart="@dimen/margin_big" android:paddingEnd="@dimen/margin_larger" android:src="@drawable/ic_gallery" android:paddingTop="@dimen/margin_14" android:paddingBottom="@dimen/margin_14" app:layout_constraintStart_toEndOf="@id/cameraBtn" app:layout_constraintTop_toTopOf="@id/cameraBtn" app:layout_constraintBottom_toBottomOf="@id/cameraBtn" app:layout_constraintHorizontal_chainStyle="packed"/> </androidx.constraintlayout.widget.ConstraintLayout>
验证效果
- 当RecyclerView为
GONE时,creatorEditorContainer会紧贴closeButton下方,高度自适应内部内容,不会再居中; - 点击@图标将RecyclerView设为
VISIBLE时,它会自动填充creatorEditorContainer底部到tagPlaceholder顶部的空间,符合弹出扩展的需求。
内容的提问来源于stack exchange,提问作者OK200
相关产品推荐
相关产品推荐

