原文地址:http://p.codekk.com/detail/Android/gyf-dev/ImmersionBar
基础用法(已经可以满足日常沉浸式)
ImmersionBar.with(this).init();
高级用法(每个参数的意义)
ImmersionBar.with(this)
.transparentStatusBar() //透明状态栏,不写默认透明色
.transparentNavigationBar() //透明导航栏,不写默认黑色(设置此方法,fullScreen()方法自动为 true)
.transparentBar() //透明状态栏和导航栏,不写默认状态栏为透明色,导航栏为黑色(设置此方法,fullScreen()方法自动为 true)
.statusBarColor(R.color.colorPrimary) //状态栏颜色,不写默认透明色
.navigationBarColor(R.color.colorPrimary) //导航栏颜色,不写默认黑色
.barColor(R.color.colorPrimary) //同时自定义状态栏和导航栏颜色,不写默认状态栏为透明色,导航栏为黑色
.statusBarAlpha(0.3f) //状态栏透明度,不写默认 0.0f
.navigationBarAlpha(0.4f) //导航栏透明度,不写默认 0.0F
.barAlpha(0.3f) //状态栏和导航栏透明度,不写默认 0.0f
.statusBarDarkFont(true) //状态栏字体是深色,不写默认为亮色
.flymeOSStatusBarFontColor(R.color.btn3) //修改 flyme OS 状态栏字体颜色
.fullScreen(true) //有导航栏的情况下,activity 全屏显示,也就是 activity 最下面被导航栏覆盖,不写默认非全屏
.hideBar(BarHide.FLAG_HIDE_BAR) //隐藏状态栏或导航栏或两者,不写默认不隐藏
.addViewSupportTransformColor(toolbar) //设置支持 view 变色,可以添加多个 view,不指定颜色,默认和状态栏同色,还有两个重载方法
.titleBar(view) //解决状态栏和布局重叠问题,任选其一
.titleBarMarginTop(view) //解决状态栏和布局重叠问题,任选其一
.statusBarView(view) //解决状态栏和布局重叠问题,任选其一
.fitsSystemWindows(true) //解决状态栏和布局重叠问题,任选其一,默认为 false,当为 true 时一定要指定 statusBarColor(),不然状态栏为透明色,还有一些重载方法
.supportActionBar(true) //支持 ActionBar 使用
.statusBarColorTransform(R.color.orange) //状态栏变色后的颜色
.navigationBarColorTransform(R.color.orange) //导航栏变色后的颜色
.barColorTransform(R.color.orange) //状态栏和导航栏变色后的颜色
.removeSupportView(toolbar) //移除指定 view 支持
.removeSupportAllView() //移除全部 view 支持
.navigationBarEnable(true) //是否可以修改导航栏颜色,默认为 true
.navigationBarWithKitkatEnable(true) //是否可以修改安卓 4.4 和 emui3.1 手机导航栏颜色,默认为 true
.fixMarginAtBottom(true) //已过时,当 xml 里使用 android:fitsSystemWindows="true"属性时,解决 4.4 和 emui3.1 手机底部有时会出现多余空白的问题,默认为 false,非必须
.addTag("tag") //给以上设置的参数打标记
.getTag("tag") //根据 tag 获得沉浸式参数
.reset() //重置所以沉浸式参数
.keyboardEnable(true) //解决软键盘与底部输入框冲突问题,默认为 false,还有一个重载方法,可以指定软键盘 mode
.keyboardMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) //单独指定软键盘模式
.setOnKeyboardListener(new OnKeyboardListener() { //软键盘监听回调
@Override
public void onKeyboardChange(boolean isPopup, int keyboardHeight) {
LogUtils.e(isPopup); //isPopup 为 true,软键盘弹出,为 false,软键盘关闭
}
})
.init(); //必须调用方可沉浸式
在 activity 的 onDestroy 方法中执行
ImmersionBar.with(this).destroy(); //必须调用该方法,防止内存泄漏
建议在 BaseActivity 中初始化和销毁,可以参看 demo 中BaseActivity
public class BaseActivity extends AppCompatActivity {
private ImmersionBar mImmersionBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mImmersionBar = ImmersionBar.with(this);
mImmersionBar.init(); //所有子类都将继承这些相同的属性
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mImmersionBar != null)
mImmersionBar.destroy(); //必须调用该方法,防止内存泄漏,不调用该方法,如果界面 bar 发生改变,在不关闭 app 的情况下,退出此界面再进入将记忆最后一次 bar 改变的状态
}
}
注意:2.2.6 版本已将ImmersionFragment这个类标记为过时,请用户自行使用懒加载方式实现
在 Fragment 使用 ImmersionBar
注意:
@Override
protected void onDestroy() {
super.onDestroy();
if (mImmersionBar != null)
mImmersionBar.destroy();
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden && mImmersionBar != null)
mImmersionBar.init();
}
①结合 dialogFragment 使用,可以参考 demo 中的BaseDialogFragment这个类
ImmersionBar.with(this, dialog) .init();
②其他 dialog
ImmersionBar.with(this, dialog, "flag") //第三个参数是为当前 Dialog 加上标记,多个 Dialog 之间不可相同
.init();
注意:在 dialog 使用,当销毁 dialog 同时,别忘了调用 ImmersionBar 的 destroy 方法了
① 使用 dimen 自定义状态栏高度,不建议使用,因为设备状态栏高度并不是固定的
在 values-v19/dimens.xml 文件下
25dp
在 values/dimens.xml 文件下
0dp
然后在布局界面添加 view 标签,高度指定为 status_bar_height
② 使用系统的 fitsSystemWindows 属性,使用该属性不会导致输入框与软键盘冲突问题,不要再 Fragment 使用该属性
然后使用 ImmersionBar 时候必须指定状态栏颜色
ImmersionBar.with(this)
.statusBarColor(R.color.colorPrimary)
.init();
③ 使用 ImmersionBar 的 fitsSystemWindows(boolean fits)方法
ImmersionBar.with(this)
.fitsSystemWindows(true) //使用该属性,必须指定状态栏颜色
.statusBarColor(R.color.colorPrimary)
.init();
④ 使用 ImmersionBar 的 statusBarView(View view)方法
在标题栏的上方增加 View 标签,高度指定为 0dp
然后使用 ImmersionBar 的 statusBarView 方法,指定 view 就可以啦
ImmersionBar.with(this)
.statusBarView(view)
.init();
//或者
//ImmersionBar.setStatusBarView(this,view);
ImmersionBar.with(this)
.titleBar(view) //可以为任意 view,如果是自定义 xml 实现标题栏的话,最外层节点不能为 RelativeLayout
.init();
//或者
//ImmersionBar.setTitleBar(this, view);
ImmersionBar.with(this)
.titleBarMarginTop(view) //可以为任意 view
.statusBarColor(R.color.colorPrimary) //指定状态栏颜色,根据情况是否设置
.init();
//或者使用静态方法设置
//ImmersionBar.setTitleBarMarginTop(this,view);
ImmersionBar.with(this)
.keyboardEnable(true) //解决软键盘与底部输入框冲突问题
// .keyboardEnable(true, WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
// | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) //软键盘自动弹出
.init();
ImmersionBar.with(this)
.statusBarDarkFont(true, 0.2f) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度
.init();
public static boolean hasNavigationBar(Activity activity)
判断是否存在导航栏
public static int getNavigationBarHeight(Activity activity)
获得导航栏的高度
public static int getNavigationBarWidth(Activity activity)
获得导航栏的宽度
public static boolean isNavigationAtBottom(Activity activity)
判断导航栏是否在底部
public static int getStatusBarHeight(Activity activity)
获得状态栏的高度
public static int getActionBarHeight(Activity activity)
获得 ActionBar 的高度
public static boolean isSupportStatusBarDarkFont()
判断当前设备支不支持状态栏字体设置为黑色
public static void hideStatusBar(Window window)
隐藏状态栏
-keep class com.gyf.barlibrary.* {*;}