Android:隐藏标题栏/透明顶部状态栏

Posted zstar-_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:隐藏标题栏/透明顶部状态栏相关的知识,希望对你有一定的参考价值。

因为在项目中用到了这两个功能,而且这两个功能使用频率也很高,特别mark一下。我所记录的只是我实现有效的方式,当然也有其它更简单的方式,这里只以需求为导向,不作细究。

隐藏标题栏

隐藏标题栏比较简单,只需要在MainActivity中的onCreate下添加

 ActionBar actionBar = getActionBar();
        if (actionBar != null) 
            actionBar.hide();
        

透明顶部状态栏

状态栏默认的颜色是绿色的,很丑,更改颜色可以在theme中修改对应主题的颜色。
当然,个人认为透明状态栏最为美观,下面是实现方式:

1、在gradle中添加依赖

 api 'com.readystatesoftware.systembartint:systembartint:1.0.3'

添加完记得 Sync Now一下。

2、创建StatusBarUtil工具类
StatusBarUtil.java

package com.baidu.location.demo;

import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.readystatesoftware.systembartint.SystemBarTintManager;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 状态栏工具类
 */
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以上版本
     *
     * @param activity
     * @param colorId
     */
    public static void setStatusBarColor(Activity activity, int colorId) 

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            Window window = activity.getWindow();
            window.setStatusBarColor(activity.getResources().getColor(colorId));
         else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
            //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明
            transparencyBar(activity);
            SystemBarTintManager tintManager = new SystemBarTintManager(activity);
            tintManager.setStatusBarTintEnabled(true);
            tintManager.setStatusBarTintResource(colorId);
        
    

    /**
     * 状态栏亮色模式,设置状态栏黑色文字、图标,
     * 适配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);
        

    


    /**
     * 设置状态栏图标为深色和魅族特定的文字风格
     * 可以用来判断是否为Flyme用户
     *
     * @param window 需要设置的窗口
     * @param dark   是否把状态栏文字及图标颜色设置为深色
     * @return boolean 成功执行返回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 = 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     是否把状态栏文字及图标颜色设置为深色
     * @return boolean 成功执行返回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;
    

3、在MainActivity中的onCreate下添加

StatusBarUtil.transparencyBar(this);

这样就设置好了。

参考资料

Android 天气APP(四)搭建MVP框架与使用

以上是关于Android:隐藏标题栏/透明顶部状态栏的主要内容,如果未能解决你的问题,请参考以下文章

Android 隐藏状态栏、标题栏、透明状态栏的几种方式

android为啥透明不能全屏?如何将状态栏给隐藏起来。

android中状态栏怎么布局

Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)

Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)

Android沉浸式状态栏