设置Snackbar锚点为adContainer后FAB无法浮动的解决方法
解决Snackbar锚定到adContainer时FAB无法浮动的问题
问题描述
我遇到一个困扰:当把Snackbar的anchorView设置为adContainer时,我的FAB(浮动操作按钮)就没办法正常浮动了;但如果不设置锚点视图,FAB的浮动表现完全正常。我的实现代码和布局如下:
初始Kotlin代码
val snackbar = Snackbar.make(main_content, "Item Deleted", Snackbar.LENGTH_INDEFINITE) snackbar.anchorView = adContainer snackbar.setAction("Dismiss"){ } snackbar.show()
XML布局文件
<?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" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/rootConstraintLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Snackbar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/adContainer" android:layout_width="match_parent" android:layout_height="64dp" android:layout_marginStart="1dp" android:layout_marginTop="1dp" android:layout_marginEnd="1dp" android:layout_marginBottom="1dp" android:background="#F44336" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/floatingActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_marginBottom="96dp" android:layout_marginEnd="32dp" android:clickable="true" app:layout_anchorGravity="end|bottom" app:srcCompat="@android:drawable/ic_input_add" android:focusable="true" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>
解决方案
感谢@Zain的思路,正确的实现方式是直接修改Snackbar视图的布局参数来锚定到adContainer,既能保持FAB的正常浮动,还能让底部边距生效:
val snackbar = Snackbar.make(main_content, "Item Deleted", Snackbar.LENGTH_INDEFINITE) snackbar.setAction("Dismiss") { } // 获取Snackbar的根视图 val snackbarView = snackbar.view // 转换为CoordinatorLayout对应的布局参数 val params = snackbarView.layoutParams as CoordinatorLayout.LayoutParams // 设置锚点为adContainer params.anchorId = R.id.adContainer // 设置Snackbar对齐到adContainer的顶部 params.anchorGravity = Gravity.TOP // 设置Snackbar与adContainer之间的底部边距 params.bottomMargin = 16 // 把修改后的参数应用回去 snackbarView.layoutParams = params snackbar.show()
你的代码问题分析
你自己尝试的代码虽然能让FAB正常工作,但bottomMargin无效,问题出在你额外设置了params.gravity = Gravity.TOP——这个属性会覆盖锚点相关的布局逻辑,导致边距设置不生效。只需要保留anchorId、anchorGravity和bottomMargin的设置即可,不需要手动设置gravity属性。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

