ConstraintLayout中给绑定多视图的背景View添加边距的正确方法是什么?
方案1:直接调整现有背景View的边距(改动最小)
你当前的背景View是对齐到目标控件的上下左右边缘,只需给这个View增加负向边距就能让背景向外扩展出需要的边距,不需要修改任何内部控件的配置,示例代码如下:
<View android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/edit_add_card_group_shape" android:layout_marginStart="-8dp" android:layout_marginEnd="-8dp" android:layout_marginTop="-8dp" android:layout_marginBottom="-8dp" app:layout_constraintStart_toStartOf="@id/tvContact" app:layout_constraintEnd_toEndOf="@id/etPhoneNumber" app:layout_constraintTop_toTopOf="@id/btAreaCode" app:layout_constraintBottom_toBottomOf="@id/btAddPhone" />
边距数值可以根据设计需求自由调整,不会影响原有控件的布局逻辑。
方案2:使用Inset Drawable实现背景内边距
无需修改布局约束,仅通过修改背景配置就能实现效果:新建一个drawable文件,把原有的背景drawable包一层inset标签,让背景自带内边距:
<!-- res/drawable/group_background_with_padding.xml --> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetTop="8dp" android:insetBottom="8dp" android:insetLeft="8dp" android:insetRight="8dp"> <item android:drawable="@drawable/edit_add_card_group_shape" /> </inset>
之后把背景View的android:background属性替换为这个新的drawable即可。
方案3:最优替代方案(无额外布局嵌套)
如果你使用的是ConstraintLayout 2.0及以上版本,可以用Flow虚拟辅助控件代替单独的背景View,完全不需要嵌套容器,所有控件仍保持在原有布局层级:
<androidx.constraintlayout.helper.widget.Flow android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/edit_add_card_group_shape" android:padding="8dp" app:constraint_referenced_ids="btAreaCode,etPhoneNumber,btAddPhone" app:layout_constraintStart_toStartOf="@id/tvContact" app:layout_constraintEnd_toEndOf="@id/etPhoneNumber" app:layout_constraintTop_toTopOf="@id/btAreaCode" app:layout_constraintBottom_toBottomOf="@id/btAddPhone" />
Flow属于ConstraintLayout的内置辅助控件,不会产生额外布局层级,也不需要单独维护背景和控件的对齐逻辑,后续新增需要归入同一背景的控件时,只需要把id加到constraint_referenced_ids属性中即可。
内容的提问来源于stack exchange,提问作者Ron Petrosian
相关产品推荐
相关产品推荐

