沉浸式狀態欄

***(很是有用)沉浸式策略——取消狀態欄/導航欄顯示android

***(很是有用)Android 沉浸式狀態欄完美解決方案ide

針對系統5.0以上佈局

目標1:讓標題欄和狀態欄顏色融合爲一體,高度不變

 

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int color= Resources.getSystem().getColor(android.R.color.holo_green_light);
        StatusBarUtil.setStatusBarColor(this,color);
    }

目標2:讓圖片填滿整個屏幕

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StatusBarUtil.cancelStatusBarHeight(this);
    }

 

目標3:讓圖片充滿屏幕後,從新顯示狀態欄,並設置狀態欄顏色

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StatusBarUtil.cancelStatusBarHeight(this);
        StatusBarUtil.setRootViewFitsSystemWindows(this,true);
        int color= ContextCompat.getColor(this,android.R.color.holo_green_light);
        StatusBarUtil.setStatusBarColor(this, color);
    }

 

statusBarUtil文件

/**
     * 設置狀態欄透明,取消狀態欄高度,讓佈局佔據狀態欄空間
     */
    @TargetApi(19)
    public static void cancelStatusBarHeight(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.x開始須要把顏色設置透明,不然導航欄會呈現系統默認的淺灰色
            Window window = activity.getWindow();
            View decorView = window.getDecorView();
            //兩個 flag 要結合使用,表示讓應用的主體內容佔用系統狀態欄的空間
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
            //導航欄顏色也能夠正常設置
            //window.setNavigationBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = activity.getWindow();
            WindowManager.LayoutParams attributes = window.getAttributes();
            int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            attributes.flags |= flagTranslucentStatus;
            //int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
            //attributes.flags |= flagTranslucentNavigation;
            window.setAttributes(attributes);
        }
    }

/**
     *  代碼實現android:fitsSystemWindows
     *
     * @param activity
     */
    public static void setRootViewFitsSystemWindows(Activity activity, boolean fitSystemWindows) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            ViewGroup winContent = (ViewGroup) activity.findViewById(android.R.id.content);
            if (winContent.getChildCount() > 0) {
                ViewGroup rootView = (ViewGroup) winContent.getChildAt(0);
                if (rootView != null) {
                    rootView.setFitsSystemWindows(fitSystemWindows);
                }
            }
        }

    }


/**
     * 修改狀態欄顏色
     *
     * @param colorId 顏色
     */
    public static void setStatusBarColor(Activity activity, int colorId) {

        int color= ContextCompat.getColor(activity,colorId);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            if (window!=null){
                window.setStatusBarColor(color);
            }
        }
    }