如何让include标签布局位于AppBarLayout与BottomNavigationView之间?
我来帮你搞定这个布局遮挡的问题~ 你的核心问题是include引入的内容没有被正确约束在AppBar和底部导航栏之间,下面是具体的解决方案:
问题根源分析
你现在的布局里,include标签直接作为CoordinatorLayout的子View存在,既没有设置跟随AppBar滚动的行为,也没有预留底部导航栏的空间,导致内容会延伸到AppBar下方和BottomNavigationView后方,造成遮挡。
解决方案一:用滚动容器包裹内容(推荐)
把include的内容放到一个支持滚动的容器里(比如NestedScrollView),并设置对应的布局行为,同时预留底部导航栏的空间:
修改后的布局代码
<?xml version="1.0" encoding="utf-8"?> <android.support.design.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:layout_width="match_parent" android:layout_height="match_parent" tools:context="co.xtvt.xtvt.ActivityDashboard"> <!-- 顶部AppBar区域 --> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay" android:animateLayoutChanges="true"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.TabItem android:id="@+id/tabExploreActivitis" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/activities" /> <android.support.design.widget.TabItem android:id="@+id/tabExplorePeople" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/people" /> <android.support.design.widget.TabItem android:id="@+id/tabExploreGroups" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/groups" /> <android.support.design.widget.TabItem android:id="@+id/tabExplorePosts" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/posts" /> </android.support.design.widget.TabLayout> </android.support.design.widget.AppBarLayout> <!-- 移除原来单独的include,改用NestedScrollView包裹 --> <android.support.v4.widget.NestedScrollView android:id="@+id/content_container" android:layout_width="match_parent" android:layout_height="match_parent" <!-- 这个behavior让内容自动在AppBarLayout下方,并支持跟随滚动 --> app:layout_behavior="@string/appbar_scrolling_view_behavior" <!-- 预留底部导航栏的高度,避免内容被遮挡 --> android:paddingBottom="@dimen/bottom_nav_height"> <include layout="@layout/content_dashboard" /> </android.support.v4.widget.NestedScrollView> <!-- 底部导航栏 --> <android.support.design.widget.BottomNavigationView android:id="@+id/bottomNavigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="0dp" android:layout_marginStart="0dp" android:background="?android:attr/windowBackground" android:layout_gravity="bottom|end" app:menu="@menu/bottom_bar_navigation" /> <!-- 悬浮按钮 --> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_marginTop="@dimen/fab_margin_top" android:layout_marginRight="@dimen/fab_margin_right" android:layout_marginLeft="@dimen/fab_margin_left" android:layout_marginBottom="@dimen/fab_margin_bottom" app:srcCompat="@android:drawable/ic_menu_add" /> </android.support.design.widget.CoordinatorLayout>
补充步骤
在res/values/dimens.xml中添加底部导航栏的高度值(默认是56dp):
<dimen name="bottom_nav_height">56dp</dimen>
解决方案二:使用锚点布局(无需手动设置margin)
如果你不想手动设置padding,可以利用CoordinatorLayout的锚点特性,让内容容器自动对齐底部导航栏的顶部:
<!-- 替换原来的include,用FrameLayout包裹 --> <FrameLayout android:id="@+id/content_container" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" <!-- 锚定到底部导航栏 --> app:layout_anchor="@id/bottomNavigation" app:layout_anchorGravity="top"> <include layout="@layout/content_dashboard" /> </FrameLayout>
注意:这种方式需要确保BottomNavigationView的定义在内容容器之前,或者确保id引用正确。
额外注意事项
我注意到你的布局里同时存在ViewPager和include的content_dashboard,两者都是match_parent高度,这会导致它们互相重叠。你需要根据实际需求:
- 如果
ViewPager是Tab对应的主内容,那content_dashboard应该放到ViewPager对应的Fragment中; - 如果
content_dashboard是当前页面的主内容,那可以移除ViewPager; - 如果需要两者共存,要调整它们的布局关系(比如设置visibility、叠加层级等)。
内容的提问来源于stack exchange,提问作者MRu
相关产品推荐
相关产品推荐

