Android 的标题栏和状态栏

Android 的标题栏和状态栏 标题栏和状态栏是每一个Android开发都要去处理的
一:标题栏
你打开任何一个App都有相对应的标题栏,那么Android系统提供给我们的标题栏是什么了
我们Android Studio创建一个应用

//这个Application节点给我们一个默认的主题风格,这样的话整个app的主题风格都是这个,我们也可以设置自己的activity的主题风格 //这个设置了自己Activity的主题风格

我们先看一下默认现在的主题风格是什么
@color/purple_500//您的应用的主要品牌颜色,主要用于主题 @color/purple_700//您的主要品牌颜色的较浅/较暗变体,在主题中很少使用 @color/white//用于显示在原色上方的元素的颜色(例如,文本和图标,根据可访问性,通常为白色或半透明的黑色)@color/teal_200//您应用程式的次要品牌色彩,主要用于强调某些需要突出的小部件 @color/teal_700//您的次要品牌颜色的较浅/较深变体,在主题中很少使用 @color/black//用于显示在辅助颜色顶部的元素的颜色?attr/colorPrimaryVariant//状态栏使用的颜色

默认的父类的主题风格是parent="Theme.MaterialComponents.DayNight.DarkActionBar"
这个主题就是Android规范设计风格Material和之前的Theme.AppCompat.DayNight.DarkActionBar没什么大的区别,也都有不带ActionBar的主题风格Theme.AppCompat.DayNight.NoActionBar,Theme.MaterialComponents.DayNight.NoActionBar还有好多种主题风格,以后研究专门讲
@color/red//这个设置标题栏的颜色 @color/green//这个设置状态栏的颜色 @color/blue item name="windowActionBar">falsetrue

方式一:这个可以设置appliction和activty主题风格都可以
false
true
这2个在主题中可以去掉标题栏
方式二:在代码中使用requestWindowFeature也可以去掉标题栏
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉标题栏注意这句一定要写在setContentView()方法的前面,不然会报错的,这个只针对特定的页面Activty setContentView(R.layout.activity_main); }

方式三:就是Theme.AppCompat.DayNight.NoActionBar直接设配NoActionBar主题风格
二:状态栏
去掉状态栏(状态栏一般不去掉)
方式一:代码实现
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉标题栏注意这句一定要写在setContentView()方法的前面,不然会报错的 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //去掉状态栏,但是变成黑色阴影 setContentView(R.layout.activity_main); }

方式二:主题风格设置全屏
true//这些都是针对之前系统版本的
我们要设置全面屏
我们状态栏这只能透明的
/** * 设置状态栏透明,启用全屏模式 * @param activity */ @TargetApi(19) public static void transparencyBar(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } }

针对状态栏修改状态栏的为全面屏,和状态栏的字体颜色变化,变黑,和变白种不同的方法
public class StatusBarUtil {/** * 修改状态栏为全透明 * @param activity */ @TargetApi(19) public static void transparencyBar(Activity activity){ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window =activity.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } }/** *状态栏亮色模式,设置状态栏黑色文字、图标, * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android * @param activity * @return 1:MIUUI 2:Flyme 3:android6.0 */ public static int StatusBarLightMode(Activity activity){ int result=0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //小米的亮度模式 if(MIUISetStatusBarLightMode(activity, true)){ result=1; //魅族的亮度模式 }else if(FlymeSetStatusBarLightMode(activity.getWindow(), true)){ result=2; //原生 }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); result=3; } } return result; }/** * 已知系统类型时,设置状态栏黑色文字、图标。 * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android * @param activity * @param type 1:MIUUI 2:Flyme 3:android6.0 */ public static void StatusBarLightMode(Activity activity,int type){ if(type==1){ MIUISetStatusBarLightMode(activity, true); }else if(type==2){ FlymeSetStatusBarLightMode(activity.getWindow(), true); }else if(type==3){ activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); }}/** * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标 */ public static void StatusBarDarkMode(Activity activity,int type){ if(type==1){ MIUISetStatusBarLightMode(activity, false); }else if(type==2){ FlymeSetStatusBarLightMode(activity.getWindow(), false); }else if(type==3){ activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); }}/** * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标 */ public static int StatusBarDarkMode(Activity activity){ int result=0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //小米的亮度模式 if(MIUISetStatusBarLightMode(activity, false)){ result=1; //魅族的亮度模式 }else if(FlymeSetStatusBarLightMode(activity.getWindow(), false)){ result=2; //原生 }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); result=3; } } return result; }/** * 设置状态栏图标为深色和魅族特定的文字风格 * 可以用来判断是否为Flyme用户 * @param window 需要设置的窗口 * @param dark 是否把状态栏文字及图标颜色设置为深色 * @returnboolean 成功执行返回true * */ public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { try { WindowManager.LayoutParams lp = window.getAttributes(); Field darkFlag = WindowManager.LayoutParams.class .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); Field meizuFlags = WindowManager.LayoutParams.class .getDeclaredField("meizuFlags"); darkFlag.setAccessible(true); meizuFlags.setAccessible(true); int bit = darkFlag.getInt(null); int value = https://www.it610.com/article/meizuFlags.getInt(lp); if (dark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); result = true; } catch (Exception e) {} } return result; }/** * 需要MIUIV6以上 * @param activity * @param dark 是否把状态栏文字及图标颜色设置为深色 * @returnboolean 成功执行返回true * */ public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) { boolean result = false; Window window=activity.getWindow(); if (window != null) { Class clazz = window.getClass(); try { int darkModeFlag = 0; Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); if(dark){ extraFlagField.invoke(window,darkModeFlag,darkModeFlag); //状态栏透明且黑色字体 }else{ extraFlagField.invoke(window, 0, darkModeFlag); //清除黑色字体 } result=true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上 if(dark){ activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); }else { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } } }catch (Exception e){} } return result; } }

三:自定义标题栏ToolBar
最基本的使用background 设置背景色

Android 的标题栏和状态栏
文章图片


toolBar还可以添加菜单Menu
通过inflateMenu可以添加toolbar的菜单
在res目录下新建文件夹menu,然后创建toolbar_menu文件
Android 的标题栏和状态栏
文章图片

Toolbar toolbar=findViewById(R.id.toolbar); toolbar.inflateMenu(R.menu.toolbar_menu);

toolbar_menu的文件内容

【Android 的标题栏和状态栏】END:世界上那些最容易的事情中,拖延时间最不费力

    推荐阅读