返回子Fragment后父Fragment底部内容被BottomNavigationView遮挡的修复方法
我来帮你搞定这个问题!这种情况一般是因为从子Fragment返回后,你的Newsfeed Fragment布局没有预留出底部导航的空间,导致内容被遮挡。咱们有几个简单有效的修复方案,你可以根据需求选择:
方案1:给RecyclerView添加底部内边距(最直接)
因为你的内容是放在RecyclerView里的,只需要给它添加底部内边距,同时设置clipToPadding="false",这样RecyclerView的内容会滚动到内边距区域,不会被底部导航挡住。
修改你的newsfeed.xml里的RecyclerView部分:
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView_feed_post" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_below="@id/app_bar" android:background="@color/background" android:scrollbars="vertical" <!-- 添加这两行 --> android:paddingBottom="@dimen/bottom_nav_height" android:clipToPadding="false" />
然后在res/values/dimens.xml里定义底部导航的高度(BottomNavigationView默认高度是56dp):
<resources> <dimen name="bottom_nav_height">56dp</dimen> </resources>
方案2:动态计算底部导航高度(更适配)
如果担心不同设备底部导航高度有差异,或者后续修改了底部导航的样式,你可以动态获取它的高度,再给RecyclerView设置内边距。
在你的NewsfeedFragment的onViewCreated方法里添加代码:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); RecyclerView recyclerView = view.findViewById(R.id.recyclerView_feed_post); BottomNavigationView bottomNav = getActivity().findViewById(R.id.navigation); // 用post确保底部导航已经完成测量 bottomNav.post(() -> { int navHeight = bottomNav.getHeight(); recyclerView.setPadding(0, 0, 0, navHeight); recyclerView.setClipToPadding(false); }); }
方案3:给Fragment根布局添加底部内边距
如果你希望整个Fragment的内容都不被遮挡(而不仅仅是RecyclerView),可以给NewsfeedFragment的根布局(CoordinatorLayout)添加底部内边距:
<android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/bottom_nav_height"> <!-- 其他布局内容 --> </android.support.design.widget.CoordinatorLayout>
为什么会出现这个问题?
你的MainActivity布局是没问题的——fragment_container用layout_weight=1占据了除底部导航外的所有空间。但因为NewsfeedFragment里用了CoordinatorLayout+AppBarLayout的组合,从子Fragment返回时,布局可能没有重新正确计算底部的可用空间,导致内容延伸到了底部导航的区域。添加内边距就能把内容往上推,避开底部导航的遮挡。
内容的提问来源于stack exchange,提问作者rupal3112

