編輯:關於Android編程
首先我要區分清楚沉浸式狀態欄與變色狀態欄。
沉浸式狀態欄指的是,狀態欄隱藏,在手指做了相關操作後,狀態欄顯示出來,例如視頻播放器,在播放視頻時是隱藏狀態欄的,但是點擊屏幕的時候,狀態欄會顯示出來,再例如文本閱讀器,在閱讀的時候是全屏的,然後從屏幕上方下滑或者下方上劃,虛擬鍵和狀態欄出現了,但卻是直接覆蓋在程序文字上的,這是所謂的沉浸式狀態欄。
那麼大家平時所說的狀態欄與導航欄顏色相同,或者透明,指的是變色狀態欄,或者透明狀態欄。
對於這兩個概念的理解,大家可以參考http://www.androidchina.net/3520.html。
v19(4.4)以後開始支持android:windowTranslucentStatus屬性,透明狀態欄,而v21(5.0)以後出現變色狀態欄,可以自由設置狀態欄顏色。
通過這兩個新特性,可以幫助我們快速的實現4.4以後的狀態欄與app的導航欄顏色相同。
實現變色導航欄主要是通過styles裡面的theme來實現的:
首先,在 “values\styles.xml” 中定義一個最基礎的theme,AppTheme.Base,該主題繼承於AppCompat.Light主題,因為本例子中使用了toolbar(谷歌已經建議用toolbar取代actionbar),因此該主題的主要目的是用於隱藏自帶的actionBar,以及設置不顯示title。
接下來定義主題BaseAppTheme,繼承於上面定義的AppTheme.Base主題,該主題定義了三個顏色,分別指定狀態欄、toolbar和頁面中重點控件的顏色(顏色自己去定義)。
對於AppCompat主題中,各個顏色屬性的含義,可以參考下圖
然後定義一個AppTheme,繼承於BaseAppTheme,
在AndroidManifest.xml裡application標簽下設置主題 android:theme="@style/AppTheme"
到此,對於4.4以下的系統,會使用values\styles.xml中的AppTheme主題,那麼在4.4跟5.0這兩個系統下,我們要做以下的處理。
4.4:新建“values-v19\styles.xml”
在裡面定義適用與4.4系統的AppTheme,在4.4系統中提出的是透明狀態欄,因此這裡我們定義一個AppTheme繼承於BaseAppTheme,其中只要實現透明狀態欄,代碼如下:
5.0:新建“values-v21\styles.xml”
在裡面定義適用與5.0系統的AppTheme,在5.0系統中提出的變色狀態欄,因此這裡我們只需定義一個AppTheme繼承於BaseAppTheme代碼如下:
注意在布局文件中要設置如下屬性,根據其字面意思,理解為,是否適應系統窗口,當設為true的時候,適應系統窗口,布局時會考慮狀態欄的存在;如果設為false,則不考慮狀態欄的存在,全屏顯示,狀態欄出現在布局上層,可參考下面效果圖。
android:fitsSystemWindows=”true”
設為true:
設為false:
vcC4tcjR1cmrtcTEv7XEoaM8L3A+DQoNCjxwPjxzdHJvbmc+17TMrMC4zbjD9zwvc3Ryb25nPjwvcD4NCg0KPHA+yc/D5tHQvr+1xMrH17TMrMC40+u1vLq9wLjR1cmrtcTJ6NbDo6zEx8O0yOe6zsq1z9bJz828y/nKvrXEo6zXtMyswLihorW8ur3AuM24w/ejrLGzvrDNvMasyKvGwc/Uyr61xMTYo78gPGJyPg0KsLS1wMDtz+ujrLzIyLu/ydLUyei1vLq9wLi1xNHVyaujrMTHw7TO0taxvdOw0dHVyavJ6LPJzbjD98mro6zKx7K7yse+zb/J0tTBy8TYo78gPGJyPg0KtPCwuMrHo6zV/b3ifjwvcD4NCg0KPHA+sru5/aOsu7nKx9KqtKbA7dK70KnM2Mrix+m/9qGjPC9wPg0KDQo8cD7K18/Io6zO0sPHsNFzdHlsZXPW0LXE0dXJq8nozqrNuMP3o6zIu7rz1NrW99Kzw+a4+bK8vtbPwqOsyejWw9K7uPaxs76wzby6zcno1sMgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz2hsXRydWWhsSAgyvTQ1DwvcD4NCg0KPHByZSBjbGFzcz0="brush:java;">
運行的結果是,在4.4系統上,完全正常顯示,而在5.0上,toolbar正常顯示了透明色,但是狀態欄顯示的是灰色透明色
4.4系統:
5.0系統:
原因應該是,4.4系統支持的就是透明狀態欄,所以只需要將狀態欄顏色設為透明,即可到達效果。
而5.0支持的是變色狀態欄,得到的效果與我們預期不同,特做如下處理:
在代碼中設置,判斷當sdk大於等於5.0時,執行以下代碼
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = 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);
}
運行後,在4.4以及5.0系統上都能實現透明效果了,效果圖如下:
源碼下載
有過一些面試經驗的人基本都深有體會,每次面試一般都會問到Fragment的知識,所以,今天我就單獨把Fragment拿出來與大家分享一下. 會涉及到Fragment如
今天簡單講解一下PackageInstaller 文件路徑: 下面開始講解: 首先,我們說一下安裝apk的幾種方式,整體上可以分為2類,一類是有界面安裝,一
IT行業是一個踩在巨人肩膀上前進的行業,否則做的事情不一定有意義,所以我也是基於havlenapetr移植的ffmpeg基礎上做了些改進,他做的主要貢獻有:1. 移植了f
Android輸入法框架(Input Method Framework,IMF)是Android中非常重要的模塊,它分布於三個部分(確切的說,是三個進程), 包含編輯框