大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Android开发中,经常需要实现下图状态栏的效果,类似于沉浸式状态栏,但这里仅仅是讨论设置状态栏的颜色和状态栏上面文字、图标的颜色的方法。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了西平免费建站欢迎大家使用!
Android 4.4(API 19)之后,就提供了修改状态栏颜色的方法,但是在 Android 6.0(API 23)之后,才支持修改状态栏上面的文字和图标颜色,默认是白色的。所以会导致一个问题,在 4.4 到 6.0 之间的系统,状态栏设置为浅色的话,状态栏上面白色的文字和图标会看不清,像下面这样:
有一些第三方的系统提供了设置状态栏和状态栏文字、图标颜色的方法,比如小米的MIUI和魅族的Flyme,所以考虑了下比较好的实现方式是:
当然,这里面也会有坑,比如 MIUI 提供的修改状态栏字体颜色方法会跟 Android 系统自带的方法冲突,官方说明如下: 关于MIUI状态栏字符颜色逻辑调整说明
经过网上的资料和自己的尝试,MIUI 系统还是同时使用 MIUI 提供的方法和 Android 系统自带的方法来修改状态栏字体颜色比较保险。
基于上面的思考,封装了设置 Android 4.4 以上系统状态栏颜色和状态栏字体、图标颜色的方法:
要在 Application Theme 加上 item name="android:fitsSystemWindows"true/item ,不然页面会顶到状态栏上面,或者在 Activity 的布局里面加上 android:fitsSystemWindows="true" 和 android:clipToPadding="false" 也可以。
最终实现的效果如下:
大家有更好的方案可以告诉我~
由于产品需求 , 要将一级页面的5个Fragment设置不一样颜色的状态栏; 然后我对着网上的博文抄了一遍 ,发现兼容问题很差 , 要么就是顶部的状态栏没有实现全屏 , 要么就是底部的虚拟按钮遮挡导航栏(华为手机和小米手机), 最后自定义主题和设置xml布局顶部高度来解决了这个问题;
解决方案:
第一步.在values的styles中自定义主题:
第二步.创建values-v19文件夹和styles.xml:
第三步.创建values-v21文件夹和styles.xml:
第三步.引用主题:
第四步.Fragment 状态栏填充颜色:(如果一节界面的头部是轮播图直接预留20dp的高度)
不设置预留高度,状态栏会和toolbar叠加在一起 (状态栏在toolbar上方)
运行后效果图如下:
轮播图在顶部的时候直接预留状态栏的高度即可:
指定颜色的界面设置多一层有颜色的View:
首先创建一个空项目,如下图
可以看到状态栏是白字黑背景, 导航栏也是白图标黑背景
嘿嘿, 我们先把状态栏隐藏掉,在添加一个ImageView, 让ImageView做背景(方便查看)
样子如下:
将状态栏和导航栏设置透明, 找到 Manifest.xml 文件, 在主题样式中修改
android:statusBarColor 设置状态栏背景色
android:navigationBarColor 同上
android:windowLightStatusBar 设置状态栏文字色, true为深色, false为白色
android:windowLightNavigationBar 同上
android:windowTranslucentStatus 设置状态栏半透明状态, true为半透明, false为不透明
android:windowTranslucentNavigation 同上
最后两个半透明状态下面没用, 可自己尝试看效果
效果图如下:
可以看到导航栏与状态栏并没有透明,原因是默认不能占用状态栏空间与导航栏空间,根布局背景为白色,所有这里显示白色
可以通过设置 getWindow().getDecorView().setSystemUiVisibility() 来适配
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 适配状态栏空间
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 适配导航栏空间
效果如下:
Activity activity = getActivity();
Window window = activity ==null ?null : activity.getWindow();
if (window !=null Build.VERSION.SDK_INT = Build.VERSION_CODES.M) {
window.setStatusBarColor(getResources().getColor(R.color.statusbarcolor, null));
int visibility = window.getDecorView().getSystemUiVisibility();
visibility = visibility|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
window.getDecorView().setSystemUiVisibility(visibility);
}
设置状态栏为沉浸式模式
Window window = getWindow();
if (window !=null) {
if (Build.VERSION.SDK_INT = Build.VERSION_CODES.M) { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
window.setStatusBarColor(Color.TRANSPARENT); }
}
设置状态栏为非沉浸式模式并设置颜色
Window window = getWindow();
if (window !=null) {
if (Build.VERSION.SDK_INT = Build.VERSION_CODES.M) {
window.setStatusBarColor(getResources().getColor(R.color.status_color));
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
参考如下内容:
android4.4 以下修改状态栏颜色的方法为:
1、首先会懂得反编译,电脑上要安装java环境和反编译工具。没有的百度搜索下载安装。这里就不多说了。
2、要准备一个framework-res.apk放在一边待用,把framework-res.apk复制到反编译工具里、反编译framework-res.apk后打开res\values\styles.xml。
3、直接搜索以下代码
style name="TextAppearance.StatusBar" parent="@style/TextAppearance"
你会看见style name="TextAppearance.StatusBar" parent="@style/TextAppearance"
item name="textSize"14.0sp/item
item name="textStyle"normal/item
item name="textColor"?textColorPrimary/item
/style 然后修改这一段代码item name="textColor"?textColorPrimary/item 为 item name="textColor"#ff000000/item
000000为颜色代码 想要什么颜色就修改成自己喜欢的颜色就可以了 颜色对照表可以参考
4、然后回编译。回编译完成后用电脑上的压缩软件打开回编译好的framework-res.apk,拖出里面的resources.arsc替换进事先准备好的framework-res.apk里就可以了。然后用复制到内存卡 用RE复制或者移动到system里 修改权限 3 1 0,在移动到framework里覆盖就可以了。关机重启,状态栏的通知内容颜色也变了。
先看一下默认的情况:
蓝色一行是自定义的导航栏,
黑色的是自带的 ActionBar ,也就是我们说的标题栏。
首先一般都会选择去掉 ActionBar:
隐藏 actionbar 有很多种方法
这种方法是全局中隐藏了标题栏。
其实在我的手机更新系统之前,隐藏了 ActionBar 后,状态栏和自定义的导航栏颜色是相匹配的,不知道什么原因现在默认为灰色了。
上面使用的主题虽然隐藏了标题栏,但是和我们自定义的导航栏不搭,
这时候我们可以选择用自定义的主题(Theme),来改变状态栏:
在 values 下的 style.xml 中添加
或者在 onCreate 中:
上面两行一般不一起设置,二选一即可。
第一行设置导航栏为透明,第二行将导航栏隐藏。
不推荐第二种做法,如果一个 Activity 中设置了隐藏导航栏而另一个 Activity 没有,那两者切换的时候会不好看。
融合的效果:
状态栏和 app 顶部相融合了,如果标题栏是一张图片效果会更好。
这里还有一个问题,状态栏的文字和我们导航栏的文字重叠了,
我们可以选择在布局文件的根元素中添加:
让布局为状态栏留出空间,就不会出现上面这张被状态栏遮挡的情况。
如果像上面的例子是一样的纯色的标题栏,我们可以选择直接改变状态栏的颜色解决问题。
或者:
不显示时间、电量等信息和文字:
同要可以用修改 Theme 来实现:
或者在 OnCreat() 中加入,还是要注意加在 setContentView() 的前面
如果想让图片全屏要注意设置为: