Android中设置含BottomNavigationView的LinearLayout背景透明无效问题
问题描述
我有一个内部包含BottomNavigationView(来自Material Design Library v2)的LinearLayout,为使底部导航栏呈现悬浮效果,给该LinearLayout设置了左右20dp的边距,但即使将其背景设为#00ffffff或@null,背景始终无法透明。
截图:
布局代码:
<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=".MainActivity" android:id="@+id/mainActivityConstraint"> <LinearLayout android:id="@+id/MainLinearLayoutMainActivity" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" app:layout_constraintTop_toTopOf="@id/mainActivityConstraint" app:layout_constraintBottom_toBottomOf="@id/mainActivityConstraint"> <!-- SOME CONTENT HERE, REMOVED FOR SIMPLIFICATION, HAS NO EFFECT ON LATER CODE --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginStart="40dp" android:layout_marginEnd="40dp" android:layout_marginBottom="10dp" android:elevation="1dp" android:background="@null"> <!-- Bottom Navigation Bar --> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_navigation" android:layout_width="wrap_content" android:layout_height="wrap_content" app:menu="@menu/bottom_navigation_menu" app:labelVisibilityMode="unlabeled" style="@style/BottomNavigationCustomStyle" android:background="@drawable/rounded_bottomnavigation_shape" android:padding="10dp"/> <!-- End of Bottom Navigation Bar --> </LinearLayout> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
解决方案
问题根源是外层的MainLinearLayoutMainActivity设置了match_parent的高度,它默认会继承主题的背景色(一般是白色),所以内层LinearLayout即使设了透明,外层背景还是会透出来,导致看不到悬浮效果。
可以按以下两种方式修改:
方式一:修改外层LinearLayout背景
直接给MainLinearLayoutMainActivity添加透明背景:android:background="@android:color/transparent"方式二:调整布局结构(更推荐)
把底部导航栏的容器LinearLayout直接放在ConstraintLayout下,不嵌套在全屏的LinearLayout里,这样它的透明背景就能直接显示底层内容。修改后的布局如下:<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=".MainActivity" android:id="@+id/mainActivityConstraint"> <!-- 主内容布局 --> <LinearLayout android:id="@+id/content_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/bottom_nav_container"> <!-- 这里放置原来的主内容 --> </LinearLayout> <!-- 底部导航栏容器 --> <LinearLayout android:id="@+id/bottom_nav_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginStart="40dp" android:layout_marginEnd="40dp" android:layout_marginBottom="10dp" android:elevation="1dp" android:background="@null" app:layout_constraintBottom_toBottomOf="parent"> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_navigation" android:layout_width="wrap_content" android:layout_height="wrap_content" app:menu="@menu/bottom_navigation_menu" app:labelVisibilityMode="unlabeled" style="@style/BottomNavigationCustomStyle" android:background="@drawable/rounded_bottomnavigation_shape" android:padding="10dp"/> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
另外还要检查BottomNavigationCustomStyle中是否设置了背景色,如果有需要确保它不会干扰透明效果。
内容的提问来源于stack exchange,提问作者Stephan rog
相关产品推荐
相关产品推荐

