Android App 沉浸式狀態列解決方案

2021-08-02 11:37:09 字數 3650 閱讀 1152

來自: 

在4.4之前狀態列一直是黑色的,在4.4中帶來了windowtranslucentstatus這一特性,因此可以實現給狀態列設定顏色,如下圖所示,狀態列顏色不再是黑色,而是可以定製的顏色。

國內將狀態列變色叫做沉浸式狀態列,時間久了,叫的人多了,大家就不再深究,預設了這種叫法。

可以在知乎上看到關於這個問題的討論:為什麼在國內會有很多使用者把「透明欄」(translucent bars)稱作 「沉浸式頂欄」?

4.4及其以上都是可以實現沉浸式狀態列效果的,5.0及其以上可以直接在主題中設定顏色,或者呼叫window類中的setstatusbarcolor(int color)來實現,這兩種方式在5.0上都比較簡單,但是如何相容到4.4呢?

背景的頁面,怎樣讓狀態列透明或者半透明(效果如下)?

使用 drawerlayout 時,主介面實現沉浸狀態列同時,怎樣保證抽屜檢視也能延伸到狀態列(如下圖所示),且相容到4.4?

以上就是本文要解決的問題,下面給出解決方案。

1. 給狀態列設定顏色

思路是:

**如下:

/** * 設定狀態列顏色 * * @param activity 需要設定的activity * @param color 狀態列顏色值 */

public static void setcolor(activity activity, int color)

}

其中生成狀態列一樣大小的矩形色塊的**如下:

/** * 生成乙個和狀態列大小相同的矩形條 * * @param activity 需要設定的activity * @param color 狀態列顏色值 * @return 狀態列矩形條 */

private static view createstatusview(activity activity, int color)

setcontentview()之後呼叫setcolor(activity activity, int color)方法即可。

2. 作背景時,狀態列透明

這個實現比較簡單,根布局背景設定為,然後新增狀態列透明 flag, 然後設定根布局的fitssystemwindows屬性為true即可。**如下:

/** * 使狀態列透明 * * 適用於作為背景的介面,此時需要填充到狀態列 * * @param activity 需要設定的activity */

public static void settranslucent(activity activity)

}

同樣的,在setcontentview()之後呼叫settranslucent(activity activity)方法即可。

3. 使用 drawerlayout 時的特殊處理

注意點:

<?xml version="1.0" encoding="utf-8"?>

解決方案

/** * 為drawerlayout 布局設定狀態列變色 * * @param activity 需要設定的activity * @param drawerlayout drawerlayout * @param color 狀態列顏色值 */

public static void setcolorfordrawerlayout(activity activity, drawerlayout drawerlayout, int color)

// 設定屬性

viewgroup drawer = (viewgroup) drawerlayout.getchildat(1);

drawerlayout.setfitssystemwindows(false);

contentlayout.setfitssystemwindows(false);

contentlayout.setcliptopadding(true);

drawer.setfitssystemwindows(false);}}

需要注意的是,drawerlayout的布局只能包含兩個直接子布局,乙個是內容布局,乙個是抽屜布局,結構如前面的示例布局所示,如果內容布局的根布局如果不是linearlayout需要對其子布局設定padding top值,否則仿狀態列色塊會被遮擋在最下面,布局內容延伸到狀態列,如下圖所示:

/** * 為 drawerlayout 布局設定狀態列透明 * * @param activity 需要設定的activity * @param drawerlayout drawerlayout */

public static void settranslucentfordrawerlayout(activity activity, drawerlayout drawerlayout)

}

同樣的,在setcontentview()之後呼叫上述解決方案中的方法即可。

@override

public void setcontentview(int layoutresid)

protected void setstatusbar() }

當子類 activity 的狀態列需要特殊處理時,比如設定不同的顏色,或者設定為背景時,重寫父類的setstatusbarcolor()方法即可,例如:

public class imagestatusbaractivity extends baseactivity 

@override

protected void setstatusbar()

對 drawerlayout 布局使用時,需要注意一點,因為方法是在setcontentview()之後立即呼叫的,所以傳進來的drawerlayout要通過findviewbyid()傳進來。如果傳入在setcontentview()之後通過findviewbyid()得到的drawerlayout, 則會造成空指標異常。

statusbarutils.setcolorfordrawerlayout(this, (drawerlayout) findviewbyid(r.id.drawer_layout), getresources()

.getcolor(r.color.colorprimary));

statusbardemo github 位址

效果在前文中都有截圖,就不多放了。

沉浸式狀態列

1.沉浸式狀態列,向下相容到android4.4。因為5.0以後對狀態列做了新的改變,5.0及其以上可以直接在主題中設定顏色,或者呼叫window類中的setstatusbarcolor int color 來實現。2.4.4到5.0系統可以通過 windowtranslucentstatus這一特...

沉浸式狀態列

還好擼主機智,直接判斷你的android版本,根據版本設定導航欄的高度,是和尚就念經,是驢子就拉磨,下面是擼主的 true animated barstyle light content networkactivityindicatorvisible 導航欄,用的功能強大的第三方庫 native b...

沉浸式狀態列

狀態列透明方法 getwindow addflags windowmanager.layoutparams.flag translucent status 或 itemname android windowtranslucentstatus trueitem 第一種方法是在 中設定,在setcont...