當前位置:首頁 » 安卓系統 » android沉浸狀態欄

android沉浸狀態欄

發布時間: 2023-03-12 07:08:36

『壹』 android怎麼在fragment沉浸狀態欄

處理思路
1.將狀態欄顏色設為透明, 利用系統提供的這個android:fitsSystemWindows="true",添加該屬性到View中;該屬性網上有很多人都寫過了。不懂的同學可以自行網路。
2.在設置了該屬性的View的高度需要寫死,大概在60-70dp左右(我在項目中將狀態欄固定為20dp,剩下尺寸就是你自己的控制項了)
3.調整View的相對位置

『貳』 Android 沉浸式狀態欄

沉浸式狀態欄是一種比較常見的UI風格,接下來就去看看怎麼實現它。

在styles.xml里增加TranslucentTheme,我們這里minSdkVersion 是以21為准,低於安卓5.0以下的手機很少了,就不適配了。

對於這種沒有標題欄,圖片沉浸到狀態欄的效果,我們已經實現了。如果是有標題欄呢?比如加個Toolbar會變成下面這樣:

對於有標題的頁面,我們希望狀態欄顏色跟標題欄一樣就行了,不希望標題欄上移跟狀態欄重疊,我們可以在布局文件根視圖設置如下屬性,這個相當於設置了個padding讓狀態欄下移,當然,為了讓狀態欄顏色跟標題欄一樣,你還需要給根視圖設置一樣的背景色(因為狀態欄實際是透明的)。

運行看看,已經實現了我們的要求。

『叄』 Android沉浸式狀態欄 如何改變狀態圖標和文字的顏色

在Android4.4設備上支持沉浸式狀態欄,只需要添加values-v19/styles.xml 下添加
?

1
2

<code class="language-xml hljs "><style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" type="text/css"><item name="android:windowTranslucentNavigation">false</item>
<item name="android:windowTranslucentStatus">true</item></style></code>

然後在可以擴展的控制項添加屬性android:fitsSystemWindows="true"
就闊以了。
但在MIUI V6下如果擴展的顏色比較淺,會導致狀態欄的文字無法看清。在其他ROM上會有漸變的灰色區域。
MIUI提供了新的解決方案,在MIUI V6上狀態欄支持灰黑色和白色兩種字體顏色,開發者可以直接設置當前界面狀態欄的文字顏色。
具體代碼:
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

<code class="language-java hljs ">/**
* 只支持MIUI V6
* @param context
* @param type 0--只需要狀態欄透明 1-狀態欄透明且黑色字體 2-清除黑色字體
*/
public static void setStatusBarTextColor(Activity context,int type){
if (!isMiUIV6()){
DebugLog.d("isMiUIV6:"+false);
return;
}
DebugLog.d("isMiUIV6:"+true);
Window window = context.getWindow();
Class clazz = window.getClass();
try {
int tranceFlag = 0;
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_TRANSPARENT");
tranceFlag = field.getInt(layoutParams);
field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
if (type == 0){
extraFlagField.invoke(window, tranceFlag, tranceFlag);//只需要狀態欄透明
}else if(type == 1){
extraFlagField.invoke(window, tranceFlag | darkModeFlag, tranceFlag | darkModeFlag);//狀態欄透明且黑色字體
}else {
extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字體
}
}catch (Exception e){

}
}

private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
private static boolean isMiUIV6() {
try {
final BuildProperties prop = BuildProperties.newInstance();
String name = prop.getProperty(KEY_MIUI_VERSION_NAME, "");
if ("V6".equals(name)){
return true;
}else {
return false;
}
// return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
// || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
// || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
} catch (final IOException e) {
return false;
}
}</code>

『肆』 android沉浸式

1、如何修改狀態欄顏色。
2、如何修改狀態欄文字顏色。
3、如何不被虛擬鍵隱藏,或隱藏虛擬鍵。
4、如何消除沉浸式。
5、如何修改導航欄內部的fragment的狀態欄顏色。

可參考: https://www.imooc.com/article/74825
在styles.xml中添加style

在manifest.xml文件中進行配置

添加依賴

可以參考:暫無
以下內容可以直接復制到工具類中,在activity初始化的時候調用即可。文字顏色分亮色暗色,分別是白色和黑色。

可以參考: https://www.jianshu.com/p/ce65dc7b0b56
以下方法可以放置在工具類中方便調用。
1、不隱藏底部虛擬鍵,不隱藏狀態欄,布局頂部延伸至狀態欄頂部不被虛擬鍵遮擋,且狀態欄透明。

2、隱藏底部的虛擬鍵和狀態欄

fragment的狀態欄顏色其實就是activity狀態欄顏色,所以還是去改變activity的狀態欄顏色這么一個思路。
使用第三方組件,所以添加依賴

給導航欄控制項添加tab切換事件監聽,然後動態改變狀態欄顏色即可,同樣使用barUtils工具類。

最後在推薦一個github上的關於沉浸式效果的組件:
https://github.com/yanzhenjie/Sofia

『伍』 Android狀態欄著色(非沉浸式狀態欄)

由於產品需求 , 要將一級頁面的5個Fragment設置不一樣顏色的狀態欄; 然後我對著網上的博文抄了一遍 ,發現兼容問題很差 , 要麼就是頂部的狀態欄沒有實現全屏 , 要麼就是底部的虛擬按鈕遮擋導航欄(華為手機和小米手機), 最後自定義主題和設置xml布局頂部高度來解決了這個問題;
解決方案:

第一步.在values的styles中自定義主題:

第二步.創建values-v19文件夾和styles.xml:

第三步.創建values-v21文件夾和styles.xml:

第三步.引用主題:

第四步.Fragment 狀態欄填充顏色:(如果一節界面的頭部是輪播圖直接預留20dp的高度)
不設置預留高度,狀態欄會和toolbar疊加在一起 (狀態欄在toolbar上方)

運行後效果圖如下:

輪播圖在頂部的時候直接預留狀態欄的高度即可:

指定顏色的界面設置多一層有顏色的View:

『陸』 如何實現Android沉浸式狀態欄

沉浸式通知欄Android4.4以上才支持的新特性。4.3不支持。
具體實現方式如下:
1.新建個公共style,設置android:fitsSystemWindows=true
<!-- 設置應用布局時是否考慮系統窗口布局;true --> <style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar"> <item name="android:fitsSystemWindows">true</item> </style>

2. 修改AndroidManifest.xml,讓所有的activity樣式默認設置為AppBaseTheme(*不同項目要靈活處理,筆者項目的activity樣式都是統一的所以這樣設置沒問題,但是實際情況下不同的activity可能調用的樣式不一樣,需要讀者自行按自己的項目來設置)
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppBaseTheme" android:name="****">

3.新增沉浸式通知欄實現類,實現原理很簡單。
1)判斷當前系統版本是不是4.4以上,判斷代碼如下:
if (VERSION.SDK_INT >= VERSION_CODES.KITKAT)
2)如果大於4.4則設置狀態欄透明化,代碼如下:
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
3)獲取activity的根rootView(DecorView),然後創建一個新的view stateBarView並把它添加到rootView(這裏手動給它設置個ID,下次進來時先判斷rootView是否已創建stateBarView,如果已創建則直接獲取該View這樣可以防止重復創建,導致內存泄露)

以下是具體代碼實現:
import android.annotation.SuppressLint;import android.app.Activity;import android.content.res.Resources;import android.graphics.drawable.Drawable;import android.os.Build;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.FrameLayout.LayoutParams;/** * 沉浸式通知欄公共類 * @author hurrican * */@SuppressLint({ "InlinedApi", "ResourceAsColor" })public class ImmersedNotificationBar { private Activity activity ; //設置沉浸式通知欄的ID(防止重復創建) private final static int IMMERSED_NOTIFICATION_BAR_ID = 12345678 ; private final static String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height" ; public ImmersedNotificationBar(Activity activity){ this.activity = activity ; } //獲取狀態欄高度 private int getStatusBarHeight(Resources res){ int statusBarHeight = 0; int resourceId = res.getIdentifier(STATUS_BAR_HEIGHT_RES_NAME, "dimen", "android"); if (resourceId > 0) { statusBarHeight = res.getDimensionPixelSize(resourceId); } return statusBarHeight ; } //添加頂部狀態欄 private View addStateBar(Activity activity,ViewGroup rootView,int statusBarHeight){ //創建新的View,並添加到rootView頂部) View statusBarView ; if(null!=rootView.findViewById(IMMERSED_NOTIFICATION_BAR_ID)){ statusBarView = rootView.findViewById(IMMERSED_NOTIFICATION_BAR_ID); }else{ statusBarView = new View(activity); rootView.addView(statusBarView); } statusBarView.setId(IMMERSED_NOTIFICATION_BAR_ID) ; LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,statusBarHeight); params.gravity = Gravity.TOP; statusBarView.setLayoutParams(params); statusBarView.setVisibility(View.VISIBLE); return statusBarView ; } /** * 設置狀態欄顏色 * @param ColorId */ public void setStateBarColor(int ColorId){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); //activity的頂級布局 ViewGroup rootView = (ViewGroup) window.getDecorView(); //透明化狀態欄 window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); Resources res = activity.getResources(); //獲取狀態欄目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarView.setBackgroundColor(ColorId) ; } } /** * 設置狀態欄顏色 * @param ColorId */ public void setStateBarDrawable(Drawable drawable){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); //activity的頂級布局 ViewGroup rootView = (ViewGroup) window.getDecorView(); //透明化狀態欄 window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); Resources res = activity.getResources(); //獲取狀態欄目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarView.setBackgroundDrawable(drawable) ; } }}

『柒』 Android 沉浸式/透明式狀態欄、導航欄

Android 從4.4開始引進透明狀態欄和導航欄的概念,並且在5.0進行了改進,將透明變成了半透明的效果。雖然此特性最早出現在ios,但不否認效果還是很贊的。
至於4.4以下的手機,就不要考慮此特性了,好在4.4以下的手機份額已經非常小了。

我們先來看一下透明狀態欄的實現,兩種常見效果圖如下:

虛擬導航欄並不是所有的手機都有,華為的手機多比較常見,就是上圖屏幕底部按鈕那塊區域。設置導航欄和狀態欄類似:

這是官方的解釋,大致意思就是我們在布局的最外層設置 android:fitsSystemWindows="true",會在屏幕最上方預留出狀態欄高度的padding。

由於fitsSystemWindows屬性本質上是給當前控制項設置了一個padding,所以我們設置到根布局的話,會導致狀態欄是透明的,並且和窗口背景一樣。

但是多數情況,我們並不在根布局設置這個屬性,我們想要的無外乎是讓內容沉浸在狀態欄之中。所以我們經常設置在最上端的圖片背景、Banner之類的,如果是Toolbar的,我們可以使用一層LinearLayout包裹,並把這個屬性設置給LinearLayout,這樣就可以避免Toolbar的內容下沉了。如:

上述方法可以解決普通頁面的透明式狀態欄需求,如有復雜需求可以參考下面這些:
Android 系統狀態欄沉浸式/透明化完整解決方案
Android 沉浸式狀態欄的實現
Android沉浸式狀態欄(透明狀態欄)最佳實現
還有開源庫推薦: ImmersionBar

熱點內容
sql資料庫遠程備份 發布:2025-05-13 16:48:13 瀏覽:528
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:167
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:738
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:150
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:399
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:545
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:632