利用一个第三方库实现透明,解决了很多异常情况
地址:https://github.com/gyf-dev/ImmersionBar
implementation 'com.gyf.barlibrary:barlibrary:2.3.0'
- 在baseActivity里onCreate()方法里初始化
mImmersionBar = ImmersionBar.with(this);
mImmersionBar
.transparentStatusBar() //透明状态栏,不写默认透明色
.statusBarDarkFont(true) //状态栏字体是深色,不写默认为亮色
.flymeOSStatusBarFontColor(R.color.title_bar_txt) //修改flyme OS状态栏字体颜色
.keyboardEnable(false)
.navigationBarEnable(false);
if ((!"Xiaomi".equalsIgnoreCase(getManufacturer())&&
(!"ZTE".equalsIgnoreCase(getManufacturer())))
&&(!"MEIZU".equalsIgnoreCase(getManufacturer()))) {
mImmersionBar.statusBarAlpha(0.2f); //状态栏透明度,不写默认0.0f
}
KLog.i("手机型号:"+getManufacturer());
mImmersionBar.init();
- 在baseactivity的onDestory()里
if (mImmersionBar != null)
mImmersionBar.destroy(); //必须调用该方法,防止内存泄漏,不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态
- 然后其他activity继承即可,布局里别忘了
android:fitsSystemWindows="true"
- 然后这个库有个问题,就是页面根布局是RelativeLayout且有输入框的情况下,输入法弹出时会把底部的布局顶上来,或者会多一块白色黑色布局
- 解决这个问题,此活动就不能使用这个工具做透明工具栏了,单独设置透明、白色状态栏黑字体样式了。可以用SystemBarTint这个工具透明,设置颜色。
- 设置字体黑色可以使用下方代码:
private void initDarkFont() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE; //防止系统栏隐藏时内容区域大小发生变化
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !OSUtils.isEMUI3_1()) {
uiFlags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; //android 6.0以上设置状态栏字体为暗色
}
getWindow().getDecorView().setSystemUiVisibility(uiFlags);
}
}
这样就把所有页面都能正确透明。