如何将Clear按钮放置在AppBarOverlay右上角 解决按钮位于标题下方问题
布局错位原因
- 你当前写在控件上的
layout_alignParentLeft、layout_alignParentEnd、layout_alignParentRight这类相对定位属性,只有RelativeLayout、ConstraintLayout这类支持相对规则的父布局才能识别生效,而AppBarLayout本身是垂直方向的线性布局衍生容器,根本不处理这类属性 - AppBarLayout默认会把直接子元素按垂直方向从上到下依次排列,所以TextView和Button才会上下堆叠,没法在同一行左右分布。
推荐修复方式
直接用官方适配顶栏逻辑的Toolbar作为AppBarLayout的内容容器,把标题和Clear按钮都放进Toolbar内部即可,不需要额外处理对齐规则:
<!-- AppBarLayout内部的子节点替换如下 --> <com.google.android.material.appbar.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/Theme.Verify.AppBarOverlay"> <androidx.appcompat.widget.Toolbar android:layout_width="match_parent" android:layout_height="?actionBarSize" app:title="@string/app_name"> <Button android:id="@+id/clear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" android:text="Clear" android:textColor="#FFF" android:textSize="12sp" /> </androidx.appcompat.widget.Toolbar> </com.google.android.material.appbar.AppBarLayout>
可选替代方案
如果不想引入Toolbar组件,可以在AppBarLayout下面嵌套一层ConstraintLayout,把原来的两个控件移到这个约束布局内部,通过约束规则实现左右对齐、垂直居中:
<com.google.android.material.appbar.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/Theme.Verify.AppBarOverlay"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="?actionBarSize" android:paddingHorizontal="@dimen/appbar_padding"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:text="@string/app_name" android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" /> <Button android:id="@+id/clear" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:text="Clear" android:textColor="#FFF" android:textSize="12sp" /> </androidx.constraintlayout.widget.ConstraintLayout> </com.google.android.material.appbar.AppBarLayout>
注意事项
- 删掉所有无效的相对定位属性,这类属性在非RelativeLayout/ConstraintLayout的父容器下不会有任何效果,还会触发IDE的属性无效警告
- 顶栏高度统一使用
?actionBarSize适配系统默认的动作栏尺寸,避免出现高度不统一、内容垂直偏移的问题 - 按钮设置
layout_gravity="end"即可靠右侧对齐,不需要额外写多套方向适配的对齐属性
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

