为何未添加Toolbar的Fragment会被RecyclerView布局中的Toolbar覆盖?
问题原因
- 你在Crud Sql对应的布局文件末尾,通过
<include layout="@layout/fragment_word_recyclerview" />直接引入了包含Toolbar的RecyclerView布局,该布局本身就自带Toolbar控件,引入后自然会显示。 - 你没有给这个include标签添加任何ConstraintLayout约束,无约束的控件在ConstraintLayout中默认会对齐到父布局左上角,因此带Toolbar的布局直接覆盖了你上方的表单控件。
- 你在RecyclerView所属Fragment的
onCreateView方法中,直接将Fragment内的Toolbar设置为了宿主Activity的ActionBar,只要该Fragment被加载到任意Activity中,就会替换该Activity的原有ActionBar配置,也可能导致Toolbar在其他页面异常显示。
解决方案
- 若你不需要在Crud界面显示该RecyclerView相关布局,直接删除Crud布局末尾的
<include layout="@layout/fragment_word_recyclerview" />代码即可。 - 若你需要在Crud界面使用RecyclerView但不需要Toolbar,可以将原fragment_word_recyclerview布局拆分为两个独立布局:一个只放Toolbar,一个只放RecyclerView,不同场景按需引入即可。
- 若要保留现有引入结构,只隐藏Crud界面的Toolbar,可以在Crud对应的Activity/Fragment逻辑中获取Toolbar实例,调用
toolbar.setVisibility(View.GONE)将其隐藏;同时给include标签添加约束,避免布局覆盖,示例如下:
<include android:id="@+id/recycler_layout" layout="@layout/fragment_word_recyclerview" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@+id/editDescription" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/>
- 建议修改Fragment中Toolbar的初始化逻辑,不要直接将Fragment内的Toolbar设置为宿主Activity的ActionBar,避免污染其他复用该Fragment的Activity配置:如果需要设置菜单、标题,直接调用Toolbar本身的API即可,无需关联Activity的ActionBar。
内容的提问来源于stack exchange,提问作者Premjit
相关产品推荐
相关产品推荐

