如何让ConstraintLayout内的SwipeFlingAdapterView占据底部栏上方剩余空间?
解决ConstraintLayout中SwipeFlingAdapterView占据剩余空间的问题
你遇到的这个问题其实是ConstraintLayout里一个很常见的小细节:当你给子View设置android:layout_height="match_parent"时,它会优先强制View填满父布局的高度,直接忽略你设置的layout_constraintBottom_toTopOf="@id/likeDislikeBar"约束,这就是为什么它会覆盖底部操作栏的原因。
想要只用ConstraintLayout解决这个问题,非常简单,只需要修改一个属性:
把SwipeFlingAdapterView的android:layout_height="match_parent"改成android:layout_height="0dp"(也就是ConstraintLayout中的match_constraint模式)。
修改后的完整布局代码
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".fragments.SwipeFragment"> <LinearLayout android:id="@+id/likeDislikeBar" android:layout_width="match_parent" android:layout_height="@dimen/like_dislike_height" android:gravity="bottom" android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent"> <ImageButton android:id="@+id/dislikeButton" android:layout_width="0dp" android:layout_height="@dimen/like_dislike_button_height" android:layout_weight="1" android:background="@null" android:src="@drawable/dislike" android:layout_gravity="center_vertical" android:scaleType="centerInside"/> <ImageButton android:id="@+id/likeButton" android:layout_width="0dp" android:layout_height="@dimen/like_dislike_button_height" android:layout_weight="1" android:background="@null" android:src="@drawable/like" android:layout_gravity="center_vertical" android:scaleType="centerInside"/> </LinearLayout> <com.lorentzos.flingswipe.SwipeFlingAdapterView android:id="@+id/frame" android:layout_width="match_parent" <!-- 关键修改:把match_parent改成0dp --> android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toTopOf="@id/likeDislikeBar" app:rotation_degrees="15.5"/> </androidx.constraintlayout.widget.ConstraintLayout>
原理说明
在ConstraintLayout中,0dp是一个特殊的尺寸值,它表示让View完全遵循你设置的约束条件来计算自身尺寸。当你设置了top_toTopOf="parent"和bottom_toTopOf="@id/likeDislikeBar"后,View就会自动填充父布局顶部到底部栏之间的剩余空间,完全符合你的需求。
而match_parent在ConstraintLayout中的实际作用是等同于同时设置top_toTopOf="parent"和bottom_toBottomOf="parent",这会直接覆盖你原本设置的底部约束,导致View填满整个父布局,进而覆盖底部操作栏。
内容的提问来源于stack exchange,提问作者sir-haver
相关产品推荐
相关产品推荐

