ImmersionBar使用教程:Android沉浸式状态栏和导航栏管理
ImmersionBar是一个强大的Android库,专门用于简化Android 4.4及以上版本的状态栏和导航栏沉浸式设计。它支持横竖屏切换、刘海屏适配、软键盘弹出等复杂场景,并允许开发者灵活定制状态栏和导航栏的颜色、透明度等样式。
项目介绍
ImmersionBar由gyf-dev开发,是一个高度兼容的沉浸式状态栏解决方案。该库支持Activity、Fragment、DialogFragment、Dialog、PopupWindow等多种组件,只需一句代码即可实现沉浸式效果。
快速开始
添加依赖
在项目的build.gradle文件中添加依赖:
dependencies {
implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2'
// kotlin扩展(可选)
implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.2'
}
基础使用
在Activity中初始化ImmersionBar:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImmersionBar.with(this)
.transparentStatusBar()
.init();
}
销毁资源
在Activity销毁时释放资源:
@Override
protected void onDestroy() {
super.onDestroy();
ImmersionBar.destroy(this);
}
核心功能详解
状态栏和导航栏颜色设置
ImmersionBar.with(this)
.statusBarColor(R.color.colorPrimary) // 状态栏颜色
.navigationBarColor(R.color.colorPrimary) // 导航栏颜色
.statusBarAlpha(0.3f) // 状态栏透明度
.navigationBarAlpha(0.4f) // 导航栏透明度
.init();
深色模式适配
ImmersionBar.with(this)
.statusBarDarkFont(true) // 状态栏深色字体
.navigationBarDarkIcon(true) // 导航栏深色图标
.autoDarkModeEnable(true) // 自动深色模式
.init();
全屏模式
ImmersionBar.with(this)
.fullScreen(true) // 全屏显示
.navigationBarColor(Color.TRANSPARENT) // 透明导航栏
.init();
适配解决方案
刘海屏适配
在AndroidManifest.xml中添加配置:
<!-- 适配华为刘海屏 -->
<meta-data
android:name="android.notch_support"
android:value="true"/>
<!-- 适配小米刘海屏 -->
<meta-data
android:name="notch.config"
android:value="portrait|landscape" />
布局重叠解决方案
方案1:使用fitsSystemWindows属性
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
</LinearLayout>
方案2:使用statusBarView方法
ImmersionBar.with(this)
.statusBarView(view) // 指定状态栏占位View
.init();
软键盘冲突解决
ImmersionBar.with(this)
.keyboardEnable(true) // 启用键盘适配
.init();
Fragment中的使用
基础Fragment实现
public class MyFragment extends Fragment {
@Override
public void onResume() {
super.onResume();
ImmersionBar.with(this).init();
}
}
ViewPager中的Fragment
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
ImmersionBar.with(Activity.this).init();
}
});
Dialog和PopupWindow中的使用
DialogFragment中的沉浸式
public class MyDialogFragment extends DialogFragment {
@Override
public void onResume() {
super.onResume();
ImmersionBar.with(this).init();
}
}
PopupWindow中的沉浸式
popupWindow.setClippingEnabled(false);
ImmersionBar.with(activity, popupWindow).init();
实用工具方法
ImmersionBar提供了丰富的工具方法:
// 判断是否存在导航栏
boolean hasNav = ImmersionBar.hasNavigationBar(activity);
// 获取状态栏高度
int statusBarHeight = ImmersionBar.getStatusBarHeight(activity);
// 获取导航栏高度
int navBarHeight = ImmersionBar.getNavigationBarHeight(activity);
// 判断是否为刘海屏
boolean isNotch = ImmersionBar.hasNotchScreen(activity);
横竖屏切换处理
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
ImmersionBar.with(this).init();
}
最佳实践建议
- 在BaseActivity中统一管理
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImmersionBar.with(this).init();
}
@Override
protected void onDestroy() {
super.onDestroy();
ImmersionBar.destroy(this);
}
}
- 不同页面使用不同配置
// 首页使用透明状态栏
ImmersionBar.with(this)
.transparentStatusBar()
.init();
// 详情页使用特定颜色
ImmersionBar.with(this)
.statusBarColor(R.color.primaryDark)
.statusBarDarkFont(true)
.init();
- 注意内存泄漏问题 确保在Dialog、PopupWindow等组件销毁时调用对应的destroy方法。
常见问题解决
白色状态栏字体适配
对于不支持状态栏字体变色的设备:
ImmersionBar.with(this)
.statusBarDarkFont(true, 0.2f) // 添加透明度适配
.init();
底部输入框被遮挡
ImmersionBar.with(this)
.keyboardEnable(true)
.keyboardMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
.init();
ImmersionBar提供了全面而灵活的沉浸式状态栏解决方案,通过简单的API调用即可实现复杂的适配需求,大大提升了Android应用的视觉体验和开发效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



