Android Kotlin开发中如何隐藏Fragment默认ActionBar并实现自定义ActionBar
解决方案
第一步:隐藏默认ActionBar
根据你的业务场景选择任意一种即可:
- 全局隐藏(适合所有页面都使用自定义ActionBar的场景)
打开res/values/themes.xml,将应用主题的父类修改为无ActionBar版本:<style name="Theme.你的应用名称" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 其余原有主题配置保持不变 --> </style> - 仅目标Fragment隐藏(适合其余页面仍需要默认ActionBar的场景)
在每个Fragment的onViewCreated方法中添加隐藏逻辑:override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) (requireActivity() as AppCompatActivity).supportActionBar?.hide() }
如果使用Navigation组件,可以统一配置OnDestinationChangedListener批量隐藏指定Fragment的ActionBar,避免重复代码
第二步:实现自定义ActionBar
1. 编写自定义ActionBar布局
新建layout/custom_action_bar.xml,按照需求添加标题、功能按钮等控件,示例如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:gravity="center_vertical" android:paddingHorizontal="16dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:textSize="18sp" android:textStyle="bold"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> <ImageView android:id="@+id/btn_search" android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/ic_search" android:layout_marginEnd="20dp"/> <ImageView android:id="@+id/btn_more" android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/ic_more"/> </LinearLayout>
2. 加载自定义ActionBar
根据需求选择加载方式:
- 每个Fragment单独引入(适合不同Fragment的ActionBar样式差异较大的场景)
在每个Fragment的根布局顶部添加include标签引入自定义布局:
之后在Fragment的<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/custom_action_bar"/> <!-- 原有Fragment布局内容 --> </LinearLayout>onViewCreated中直接绑定控件、设置点击逻辑即可:// 动态设置标题 view.findViewById<TextView>(R.id.tv_title).text = "当前Fragment标题" // 功能按钮点击事件 view.findViewById<ImageView>(R.id.btn_search).setOnClickListener { // 处理搜索逻辑 } - 宿主Activity统一加载(适合多个Fragment共用一套ActionBar样式的场景)
在宿主Activity的onCreate方法中添加如下代码:
切换Fragment时,可以在底部导航切换回调或Navigation目的地变更监听中,动态修改ActionBar的标题、按钮显示状态。supportActionBar?.apply { displayOptions = DISPLAY_SHOW_CUSTOM setCustomView(R.layout.custom_action_bar) // 移除系统ActionBar默认边距 (customView.parent as Toolbar).setContentInsetsAbsolute(0,0) }
注意事项
- 若适配沉浸式状态栏,需要给自定义ActionBar根布局添加
android:fitsSystemWindows="true"属性,避免内容和状态栏重叠 - 自定义ActionBar高度建议使用
?attr/actionBarSize,和系统默认高度保持一致,适配不同设备规格
内容的提问来源于stack exchange,提问作者Dheeraj Mehra
相关产品推荐
相关产品推荐

