API 34下FloatingActionButton的layout_anchor与layout_gravity失效问题
问题背景
我尝试使用BottomAppBar、BottomNavigationView和FloatingActionButton创建底部菜单,查阅多个解决方案及GitHub项目后仍未解决问题。开发环境为Android Studio Koala Feature Drop | 2024.1.2 Patch 1,项目配置compileSdk = 34、targetSdk = 34。Android Studio的XML预览显示正常,但项目运行后显示异常,希望得到排查帮助。
相关代码
XML布局代码
<androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/screen_bg"> <com.google.android.material.bottomappbar.BottomAppBar android:id="@+id/bottomAppBar" android:layout_width="match_parent" android:layout_height="@dimen/_60sdp" android:layout_gravity="bottom" android:background="@color/white" app:contentInsetEnd="0dp" app:contentInsetStart="0dp" app:elevation="8dp" app:fabAlignmentMode="center" app:fabCradleMargin="10dp" app:fabCradleRoundedCornerRadius="30dp" app:fabCradleVerticalOffset="12dp" app:hideOnScroll="true"> <!-- BottomNavigationView inside the BottomAppBar --> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottomNavigationView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="0dp" android:background="@android:color/transparent" app:elevation="8dp" app:itemIconTint="@android:color/black" app:itemTextColor="@android:color/black" app:labelVisibilityMode="labeled" app:menu="@menu/bottom_nav_menu" /> </com.google.android.material.bottomappbar.BottomAppBar> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab_ipo" android:layout_width="56dp" android:layout_height="56dp" android:layout_marginBottom="@dimen/_30sdp" android:backgroundTint="@color/purple_b" app:fabSize="normal" app:layout_anchor="@id/bottomAppBar" app:layout_anchorGravity="center" app:maxImageSize="25dp" app:shapeAppearance="@style/RoundFAB" app:srcCompat="@drawable/menu_ipo" tools:ignore="ContentDescription" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>
Theme配置代码
<style name="Theme.BottomBar" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/white</item> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/black</item> <item name="android:statusBarColor">?attr/colorPrimaryVariant</item> </style>
Kotlin初始化代码
private lateinit var binding: DashboardWorkingBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.dashboard_working) binding.bottomNavigationView.background = null }
排查及解决方案
从预览正常但运行异常的现象来看,问题大概率出在版本兼容、布局参数冲突或渲染缓存上,可按以下步骤排查:
- 匹配Material Components版本:确保
build.gradle中Material依赖版本与compileSdk=34兼容,建议使用com.google.android.material:material:1.12.0或更高稳定版本,版本不匹配会导致运行时渲染异常。 - 调整BottomNavigationView布局参数:将宽度改为
match_parent以填满BottomAppBar,移除冗余的layout_marginStart,同时取消自身的elevation避免和BottomAppBar重叠:<com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottomNavigationView" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" app:elevation="0dp" app:itemIconTint="@android:color/black" app:itemTextColor="@android:color/black" app:labelVisibilityMode="labeled" app:menu="@menu/bottom_nav_menu" /> - 修正BottomAppBar高度:使用系统内置的
?attr/actionBarSize替代自定义的@dimen/_60sdp,保证不同设备上的兼容性:android:layout_height="?attr/actionBarSize" - 移除FAB的marginBottom:FAB通过
layout_anchor绑定BottomAppBar,额外设置marginBottom会导致位置偏移,删除该属性,由fabCradleVerticalOffset控制垂直距离即可。 - 调整主题配置:当前主题带
DarkActionBar,若不需要顶部ActionBar,改为NoActionBar主题避免样式冲突:<style name="Theme.BottomBar" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 保留原有属性 --> </style> - 清理重建项目:执行
Build > Clean Project和Build > Rebuild Project,清除预览与运行时的缓存差异后重新运行。
内容的提问来源于stack exchange,提问作者AiVision
相关产品推荐
相关产品推荐

