您好,登錄后才能下訂單哦!
Android中怎么適配狀態(tài)欄?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1.要求狀態(tài)欄透明,我們的內(nèi)容布局延伸到系統(tǒng)狀態(tài)欄,就是人們口中說的沉浸式狀態(tài)欄:
Android 5.0 及其以后版本:設置屬性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
使得我們的內(nèi)容布局可以延伸到系統(tǒng)狀態(tài)欄,然后直接使用方法 setStatusBarColor() 把系統(tǒng)狀態(tài)欄設置成透明就好了。
Android 4.4 ~ Android 5.0 :添加了屬性 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
可以讓狀態(tài)欄變成透明,并且使我們們的內(nèi)容布局延伸到系統(tǒng)狀態(tài)欄。這個屬性雖然也可以在 Android 5.0 及其以后版本的手機上使用,但是效果不是我們想要的。
在 Android 4.4 之前是不支持透明狀態(tài)欄
需要注意的一點是在設置透明狀態(tài)欄的情況下,是需要我們的內(nèi)容布局延伸到狀態(tài)欄的,因此這個時候使用 fitSystemWindows 這個屬性是沒有意義的,只會使得出現(xiàn)各種奇葩的效果。
2.狀態(tài)欄顏色和我們布局顏色搭配
其實在有的時候,我們是不需要把我們的內(nèi)容布局延伸到系統(tǒng)狀態(tài)欄的,只是需要系統(tǒng)狀態(tài)欄和我們的內(nèi)容布局的顏色搭配起來。
**Android 5.0 及其以后版本:**直接通過 setStatusBarColor() 或者 修改colorPrimaryDark 對應的顏色,把系統(tǒng)狀態(tài)欄顏色設置成搭配的顏色就可以了
**Android 4.4 ~ Android 5.0:**這個版本其實是不允許直接修改狀態(tài)欄的顏色的,只不過我們利用了一種巧妙的方法,感覺是修改了狀態(tài)欄的顏色而已。通過 getWindow().addFlags(WindowManager.LayoutParams.FALG_TRANSLUCENT_STATUS)
是狀態(tài)欄透明,并且我們的布局也會延伸到狀態(tài)欄,給我們的內(nèi)容布局設置一個 padding,給這個 padding 設置一個合適的顏色來充當系統(tǒng)狀態(tài)欄的顏色就可以了。
Android 4.4 之前是不支持修改的
其實狀態(tài)欄的適配無外乎這兩點了,注意一定要針對不同的 Android 版本使用不同的方法,不可亂用,不可混用,不然會有各種奇葩效果!
效果圖
Android 4.4 以前
狀態(tài)欄永遠是黑底白字,沒有方法改變。上面的所有的方法也是不適用的。
Android 4.4~Android 5.0
Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 這種模式,使用這種模式可以使內(nèi)容布局占據(jù)狀態(tài)欄,效果:
android:fitsSystemWindows = "true" 屬性 可以理解為給所使用的布局設置了狀態(tài)欄大小的 padding。只會作用于 Toolbar 和 根布局。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@color/main_green_00b661" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tb" app:title="@string/activity_status_bar" app:titleTextColor="@android:color/white" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:background="@color/colorAccent"> </android.support.v7.widget.Toolbar>--> <TextView android:fitsSystemWindows="true" android:background="@color/main_green_00b661" android:layout_width="match_parent" android:layout_height="1dp" android:text="11" android:textColor="#000"/> <ImageView android:contentDescription="@string/text_input" android:id="@+id/iv" android:scaleType="fitXY" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:src="@mipmap/imga"/> <TextView android:background="@color/colorAccent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="11" android:textColor="#000"/> </LinearLayout> 比如,布局是這樣的,fitsSystemWindows 只有在根布局 LinearLayout 或者 ToolBar 上有用,在別的 View 上使用是沒有效果的。
可以看到效果了。其實就是相當于給布局設置了 padding top(高度相當于系統(tǒng)狀態(tài)欄的高度),但是考慮到兼容性的問題,如果你直接在布局中設置 paddingtop 而不是通過 FitsSystemWindows 這個屬性,那么在 Android 4.4 以下的手機上運行的話,那么效果就很糟糕了,因為 Android 4.4 以下的手機,系統(tǒng)狀態(tài)欄都是始終存在的,也就是說,這樣始終比 Android 4.4 以上系統(tǒng)的手機布局多一塊 padding ,因為這一塊 padding 沒法在系統(tǒng)狀態(tài)欄上。但是使用 fitsSystemWindo 就會完美適配了,因為這個屬性在 Android 4.4 以下的系統(tǒng)上是不起作用的。注意在使用 fitsSystemWindow 的時候,顏色問題,不同的手機系統(tǒng),可能會造成延伸到狀態(tài)欄的那一塊顏色不同,理論上顏色應該和根布局的顏色一樣。
Android 5.0
到了 Android 5.0 關于狀態(tài)欄又發(fā)生了變化,新增了直接對狀態(tài)欄的操作,直接改變狀態(tài)欄顏色,這一點在之前版本是沒有的,Android 4.4 雖然可以實現(xiàn)改變狀態(tài)欄顏色的效果,但其實實際上是將我們的布局占據(jù)了狀態(tài)欄,然后狀態(tài)欄是透明的。其實顏色還是我們布局的顏色。
對 Android 5.0 的采取
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面對 Android 4.4 的方法是一樣的);
效果圖:
Android 6.0
在 Android 6.0 添加了可以更改狀態(tài)欄字體顏色的方法,別的都是和 Android 5.0 一樣的。
狀態(tài)欄字體顏色默認是白色??梢孕薷臑楹谏?。
方法:getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
// 方法 /* * 當 insets 視圖插入,window 已經(jīng)更改了,視圖層次結構調(diào)用。允許它調(diào)整內(nèi)容來適應這些窗口。這個 insets 會告訴我們 status bar、input method 和其他系統(tǒng) window 的空間。 通常情況下我們是不需要處理此功能的,因為應用程序的默認窗口修飾會將其應用于窗口內(nèi)容。如果我們使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 或者 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 的時候,則需要處理這個函數(shù)了,這個時候如果我們不處理,我們的視圖內(nèi)容就會默認放在系統(tǒng)視圖的下面。如果我們希望系統(tǒng)視圖不覆蓋UI的某些部分,則可以在視圖層次結構中使用此方法。 默認情況下,只是將 insets(將 insets 設置為 0 )做為 View 的 padding。并且返回true。默認情況下,此行為是關閉的,但是可以通過 setFitsSystemWindows(boolean)啟用。 此功能在層次結構中的遍歷是深度優(yōu)先的。 相同的內(nèi)容insets對象沿著層次結構向下傳播,因此對其所做的任何更改都將被所有后續(xù)視圖看到(包括層次結構中的上層視圖,因為這是深度優(yōu)先遍歷)。 返回true的第一個視圖將中止整個遍歷。 */ fitSystemWindows(Rect insets);
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。