Android 状态栏的设置适配问题详解
程序员文章站
2023-11-20 17:36:46
android 状态栏的设置适配问题详解
最近看了很多关于状态栏的问题的处理,总结出处理状态栏分两个方向1>5.0一下2>5.0以上的手机状态栏的设置,,,,...
android 状态栏的设置适配问题详解
最近看了很多关于状态栏的问题的处理,总结出处理状态栏分两个方向1>5.0一下2>5.0以上的手机状态栏的设置,,,,,,,,这里说的都是自定义的toolbar,我这里已经把titlebar给隐藏掉了
(1) 关于5.0一下:首先我们需要在res文件下的style中设置,
<!-- base application theme. --> <style name="apptheme" parent="apptheme.base"> <!-- customize your theme here. --> </style> <style name="apptheme.base" parent="theme.appcompat.light.noactionbar"> <item name="colorprimary">@color/colorprimary</item> <item name="colorprimarydark">@color/colorprimarydark</item> <item name="coloraccent">@color/coloraccent</item> <item name="android:windowbackground">@android:color/white</item> <item name="android:windownotitle">true</item> </style>
这里我为什么设置apptheme.base 而不直接用apptheme,因为我继承的是appcompatactivity,如果直接对titlebar进行隐藏的话不做这个base处理,程序会报错,,,,,,如果你继承的是activity的话那不会报错 ,,,,为了处理 版本的更高适配,,,,就必须继承 appcompatactivity ,,,所以在适配5.0一下的系统的时候,就要做一个 base 来过渡 加载 style...
5.0一下的到此就结束了....
(2) 关于5.0以上的版本,,我门要在res下方增加一个 values-21文件,结构如图
置于style中的代码:如下
<style name="apptheme.noactionbar"> <item name="windowactionbar">false</item> <item name="windownotitle">true</item> <item name="android:windowdrawssystembarbackgrounds">true</item> <item name="android:statusbarcolor">@android:color/transparent</item> </style> <style name="apptheme" parent="theme.appcompat.light.noactionbar"> <item name="colorprimary">@color/colorprimary</item> <item name="colorprimarydark">@color/colorprimarydark</item> <item name="coloraccent">@color/coloraccent</item> <item name="android:windowdrawssystembarbackgrounds">true</item> <!-- 标题颜色 --> <item name="android:textcolorprimary">#000</item> <!-- 溢出菜单图标颜色 --> <item name="colorcontrolnormal">@color/white</item> <!-- 箭头 --> <item name="drawerarrowstyle">@style/drawerarrowstyle</item> <!-- 溢出菜单文字颜色 --> <item name="textappearancelargepopupmenu">@style/overflowmenutextappearance</item> <!-- 菜单项点击selector --> <item name="actionbaritembackground">@drawable/abc_item_background_holo_dark</item> </style> <!-- 左边的箭头指示 --> <style name="drawerarrowstyle" parent="widget.appcompat.drawerarrowtoggle"> <item name="spinbars">true</item> <item name="color">@color/white</item> </style> <!-- 溢出菜单文字样式 --> <style name="overflowmenutextappearance" parent="@style/textappearance.appcompat.widget.popupmenu.large"> <item name="android:textcolor">@color/white</item> </style>
手机会 根据 你手机的系统版本去加载,这两个style,5.x以上的 加载第二个 ,针对 不同的系统版本修改对应的style..........
当然 这两步足够做适配的了,但是 我们 可能需要进入不同界面 显示不通的状态栏,,,这时候 就要我们用代码控制,修改了,,,,代码 我也直接贴出来 ,,,一下 代码 是 看别人的.......
(1) 在activity设置 这些,,,
int color = getresources().getcolor(r.color.red); // view view = layoutinflater.from(this).inflate(r.layout.statusbar,null); statusbarmanager statusbarmanager = new statusbarmanager(this,color); //这里如果要移动titlebar,则在布局中指定为include的自定义statusbar的view //如果不指定,则调用setstatusbarview();会自动加一个view // statusbarmanager.setstatusbarview(view); statusbarmanager.setstatusbarview();
(2)重写 一个类statusbarmanager 进行修改 :
package com.example.administrator.statusbartest; import android.annotation.targetapi; import android.app.activity; import android.content.context; import android.graphics.color; import android.os.build; import android.view.view; import android.view.viewgroup; import android.view.window; import android.widget.framelayout; import android.widget.linearlayout; import java.lang.reflect.method; /** * created by administrator on 2017/3/21. */ public class statusbarmanager { private static final int build_version_kitkat = 19; private static final int build_version_lollipop = 21; //windowmanager.layoutparams.flag_translucent_status public static final int flag_translucent_status = 0x04000000; //windowmanager.layoutparams.flag_draws_system_bar_backgrounds public static final int flag_draws_system_bar_backgrounds = 0x80000000; private activity mactivity; private view statusbarview; private int statusbarheight; //设置状态蓝的颜色值 int color; public statusbarmanager(activity activity,int color) { this.mactivity = activity; this.color = color; statusbarheight = getstatusbarheight(activity); } public void setstatusbarview(view statusbarview) { this.statusbarview = statusbarview; settransparent(); } public void setstatusbarview() { settransparent(); } public int getstatusbarheight() { return statusbarheight; } /** * 设置状态栏全透明 * */ private void settransparent() { //4.0没有转太烂 if (build.version.sdk_int < build_version_kitkat) { return; } if(statusbarheight <= 0){ return; } transparentstatusbar(); showstatusbarview(); } @targetapi(19) private void showstatusbarview() { /** * 设置状态栏颜色的位置 */ if(statusbarview == null){ statusbarview = new view(mactivity); linearlayout.layoutparams params = new linearlayout.layoutparams(viewgroup.layoutparams.match_parent, getstatusbarheight(mactivity)); statusbarview.setlayoutparams(params); statusbarview.setbackgroundcolor(color); viewgroup decorview = (viewgroup) mactivity.getwindow().getdecorview(); framelayout content = (framelayout) decorview.findviewbyid(android.r.id.content); framelayout.layoutparams layoutparams = (framelayout.layoutparams) content.getchildat(0).getlayoutparams(); layoutparams.setmargins(0,statusbarheight,0,0); decorview.addview(statusbarview); }else{ viewgroup.layoutparams layoutparams = statusbarview.getlayoutparams(); layoutparams.height = getstatusbarheight(mactivity); statusbarview.setlayoutparams(layoutparams); statusbarview.setbackgroundcolor(color); } } /** * 参考上面注释掉的代码 因为需要用隐藏api 调用方式进行改成反射 */ private void transparentstatusbar(){ window window = mactivity.getwindow(); if (build.version.sdk_int >= build_version_lollipop) { //不add此条flag 会导致在emui3.1(华为)上失效,add这个flag 会导致在其它机型上面添加一个半透明黑条 window.addflags(flag_translucent_status); //下面的代码段是不加上面的flag时,要显示纯色的状态栏时需要加的代码 不用了 /* window.clearflags(flag_translucent_status); window.getdecorview().setsystemuivisibility(view.system_ui_flag_layout_fullscreen | view.system_ui_flag_layout_stable); window.addflags(flag_draws_system_bar_backgrounds);*/ //因为需要用隐藏api,没有重新编译5.x版本的android.jar,使用的还是18的api,这里用的反射 try { class[] argsclass=new class[]{int.class}; method setstatusbarcolormethod = window.class.getmethod("setstatusbarcolor",argsclass); setstatusbarcolormethod.invoke(window, color.transparent); } catch (exception e) { e.printstacktrace(); } }else{ window.addflags(flag_translucent_status); } } /** * 获取状态栏高度 * * @param context context * @return 状态栏高度 */ private static int getstatusbarheight(context context) { if (build.version.sdk_int < build_version_kitkat) { return 0; } // 获得状态栏高度 int resourceid = context.getresources().getidentifier("status_bar_height", "dimen", "android"); return context.getresources().getdimensionpixelsize(resourceid); } public void setstatusbarvisibility(int visibility){ if(statusbarview != null) { this.statusbarview.setvisibility(visibility); } } public void setcolor(int color){ if(statusbarview != null){ this.statusbarview.setbackgroundcolor(color); } } }
做了这些就可以自定义你的状态栏了,,,