Android三方框架设置通知栏的ImmersionBar
2019-07-18 本文已影响0人
jiangbin1992
- 这个框架很强大,整合了Android各个版本,厂商,最大限度的实现了状态栏的设置,官网地址:https://github.com/gyf-dev/ImmersionBar
- 首先使用,官方文档很详细但是要想快速理解上手,还有点疑惑,因为方法太多,要看明白你需要下载demo好好研究,如果你没时间研究就快速使用,那就看下去吧!
- 首先在基类baseactivity设置,这个是普遍用的,一次声明继承就生效了,就看用法吧 onCreate 方法加入
if (isImmersionBarEnabled()) {
initImmersionBar();
}
- 这个解释一下,官网说的意思是他isImmersionBarEnabled方法默认返回true,所以在你不想使用这个方法的界面直接重写这个方法返回fase就行了,
protected boolean isImmersionBarEnabled() {
return true;
}
protected void initImmersionBar() {
//在BaseActivity里初始化
ImmersionBar.with(this)
.statusBarColor(R.color.transparent) //状态栏颜色,不写默认透明色
.statusBarDarkFont(true) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度
.fitsSystemWindows(true)
.keyboardEnable(true)
.navigationBarColor(R.color.virtual_buttons)
.init();
// ImmersionBar.with(this)//黑底白字
// .statusBarColor(R.color.text_dark) //状态栏颜色,不写默认透明色 //状态栏颜色,不写默认透明色
// // .statusBarDarkFont(true) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度
// .fitsSystemWindows(true)
// .keyboardEnable(true)
// .navigationBarColor(R.color.virtual_buttons)
// .init();
}
- 介绍一下这个方法.init,点进去看看默认是沉浸式了已经,然后你想设置什么属性直接链式设置就行了,这个一开始我就没理解,始终不知道沉浸式怎么设置,如果你不想沉浸式你就加一个方法,这个方法是设置和通知栏重叠的,
.fitsSystemWindows(true)
- 看一下.init
/**
* 通过上面配置后初始化后方可成功调用
*/
public void init() {
//更新Bar的参数
updateBarParams();
//设置沉浸式
setBar();
//适配状态栏与布局重叠问题
fitsLayoutOverlap();
//适配软键盘与底部输入框冲突问题
fitsKeyboard();
//变色view
transformView();
}
- 所以一旦初始化就默认沉浸式了,不想要沉浸式直接设置就好了,很简单,ondestory就不说了
if (isImmersionBarEnabled()) {
// 必须调用该方法,防止内存泄漏
ImmersionBar.with(this).destroy();
}
- 重点来讲一下基类写过后子类怎么覆盖或者自定义自己需要的
- 暴力的是在oncreate方法中设置完布局setContentView()后直接ImmersionBar.with(this).destroy();然后在重新建立
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
ImmersionBar.with(this).destroy();
ImmersionBar.with(this)
.titleBar(null, false)
.transparentBar()
.fullScreen(true)
.hideBar(BarHide.FLAG_HIDE_BAR) //隐藏状态栏或导航栏或两者,不写默认不隐藏
.init();
getLogin();
}
- 但是要在本页ondestory记得销毁
- 或者还有个方法,经典啊 、.reset();直接重置,然后重新设置,不用再次销毁了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
ImmersionBar.with(this)
.reset()
.titleBar(null, false)
.transparentBar()
.fullScreen(true)
.hideBar(BarHide.FLAG_HIDE_BAR) //隐藏状态栏或导航栏或两者,不写默认不隐藏
.init();
getLogin();
}
- 还有一种就是在子类activity中重写isImmersionBarEnabled()方法,返回fase,重新创建,但是要销毁生命周期方法中。这几种是我理解的使用方式,如果不正确多谢指出啊!
- 有一种情况是mainactivity中的fragment,假如有三个,俩个要沉浸式,一个不要,怎么办,官方提供了两种解决办法,* 第一种,你的Fragment直接继承SimpleImmersionFragment或者ImmersionFragment类,在initImmersionBar方法中实现沉浸式代码,只有当immersionBarEnabled返回为true才可以走initImmersionBar方法哦,不过immersionBarEnabled默认返回已经为true了,如果当前Fragment不想走沉浸式方法,请将immersionBarEnabled设置为false
- 第二种,如果你的Fragment不能继承SimpleImmersionFragment或者ImmersionFragment类,请参考SimpleImmersionFragment实现SimpleImmersionOwner接口,或者参考ImmersionFragment实现ImmersionOwner接口,直接抄过来了,亲测都好用,我自己觉得没有那么麻烦,直接在mainactivity中全部设置沉浸式,在子类fragment中动态设置一下标题高度就行了,标题高度= title+通知栏
<LinearLayout
android:id="@+id/frg_first_head"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_50"
android:background="@color/white">
<RelativeLayout
android:id="@+id/home_rl5"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true">
<ImageView
android:id="@+id/frag_head_jpush"
android:layout_width="@dimen/dp_21"
android:layout_height="@dimen/dp_21"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/dp_15"
android:src="@mipmap/frag_first_jpush" />
<TextView
android:id="@+id/home_red"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_29"
android:layout_marginTop="@dimen/dp_8"
android:background="@drawable/shape_message"
android:paddingLeft="@dimen/dp_3"
android:paddingRight="@dimen/dp_3"
android:text=""
android:textColor="@color/white"
android:textSize="@dimen/sp_8"
android:visibility="invisible" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/head_search"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_35"
android:layout_centerInParent="true"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_15"
android:layout_toLeftOf="@+id/frag_head_history"
android:layout_toRightOf="@+id/home_rl5"
android:background="@drawable/shape_search_gray">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_15"
android:drawableLeft="@mipmap/head_search"
android:drawablePadding="@dimen/dp_5"
android:gravity="center_vertical"
android:text="请输入关键词"
android:textColor="@color/text_gray"
android:textSize="12sp" />
</RelativeLayout>
<ImageView
android:id="@+id/frag_head_history"
android:layout_width="@dimen/dp_21"
android:layout_height="@dimen/dp_21"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/dp_15"
android:layout_toLeftOf="@+id/frag_head_scan"
android:src="@mipmap/head_history"
android:visibility="gone" />
<ImageView
android:id="@+id/frag_head_scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/dp_10"
android:padding="@dimen/dp_5"
android:scaleType="centerCrop"
android:src="@mipmap/head_scan" />
</RelativeLayout>
</LinearLayout>
- 设置高度 getStatusBarHeight()。这个方法是本库提供的 直接用,他取得就是通知栏高度
LinearLayout frg_first_head = view.findViewById(R.id.frg_first_head);
frg_first_head.setPadding(0,getStatusBarHeight(), 0,0);
- 三个都这样设置一下就OK了,具体的还有很多,需要看看demo,祝大家工作愉快!