最近項目須要實現沉浸式的狀態欄,其實我在以前就瞭解過Android的沉浸式,發現有些棘手就放棄了,可是這次是公司的項目須要的,就花了幾天把這個問題搞定了,在此記錄一下,並mark幾個坑。
首先,沉浸式是Android 4.4及以上纔有的,在後續的5.0及6.0上面都增長了一些相關支持,因而問題就不太好辦了。先看我實現的效果:
首先,在4.4版本添加了WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 和 WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,即透明的狀態欄和導航欄,這裏通常會配合android
android:fitsSystemWindows="true"
android:clipToPadding="true"
1
2
一塊兒使用,這裏只給個連接:http://blog.csdn.net/jdsjlzx/article/details/46778631
因而,下面就說說遇到的問題:佈局
第一坑:狀態欄背景色字體
上面的FLAG_TRANSLUCENT_STATUS 只是把狀態欄設置爲透明的,可是!可是,狀態欄是有背景色的,一些手機的狀態欄背景色爲透明,而一些手機的狀態欄背景色爲半透明的黑色,實現的效果以下:
因而在5.0上增長了WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 和 getWindow().setStatusBarColor(int color),通常使用以下:ui
// 部分機型的statusbar會有半透明的黑色背景
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(Color.TRANSPARENT);// SDK21
1
2
3
4
因而,在5.0才能看到清爽的全透狀態欄。.net
第二坑:狀態欄字體顏色blog
狀態欄的字體顏色默認爲白色的,可是咱們應用的主題色爲黃色,白色字體在黃色背景上是不易分辨的,因此這裏得把狀態欄的字體改成深色,想一想這個也是不太好作(其實這個在IOS上面自帶的效果),可是在6.0增長了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,這個字段就是把狀態欄標記爲淺色,而後狀態欄的字體顏色自動轉換爲深色。
因此,若是須要淺色的狀態欄,只能在Android6.0及之後的版本中實現。
這裏暗藏一個坑:MIUI6+本身實現了淺色狀態欄,可是6.0的這個設置在小米手機上無效,真是 * * *!給個MIUI6沉浸式開發文檔:http://dev.xiaomi.com/doc/p=4769/ip
第三坑:輸入框頂不起來開發
原覺得效果實現了就萬事大吉,結果後面發現加入沉浸式以後,聊天頁面底部的輸入框不能被輸入法頂起來
紅色框那裏本應該是輸入框的。
網上找了好多資料,都說須要加入android:fitsSystemWindows=」true」,可是在activity的根佈局加入該屬性後,titlebar也會跟着鍵盤頂上去,這顯然不是咱們想要的結果。後面看到有人說,只須要把該屬性添加到輸入框所在的根佈局,按這個方法果真解決問題了:
好了,遇到的幾個坑都解決了,後面發現新坑再補充!文檔
另外一個沉浸式實現方案:Android沉浸式通知欄開源庫SystemBarTint源碼解析get
在BaseActivity添加以下方法:
/**
* 初始化狀態欄相關,
* PS: 設置全屏須要在調用super.onCreate(arg0);以前設置setIsFullScreen(true);不然在Android 6.0下非全屏的activity會出錯;
* SDK19:能夠設置狀態欄透明,可是半透明的SYSTEM_BAR_BACKGROUNDS會很差看;
* SDK21:能夠設置狀態欄顏色,而且能夠清除SYSTEM_BAR_BACKGROUNDS,可是不能設置狀態欄字體顏色(默認的白色字體在淺色背景下看不清楚);
* SDK23:能夠設置狀態欄爲淺色(SYSTEM_UI_FLAG_LIGHT_STATUS_BAR),字體就回反轉爲黑色。
* 爲兼容目前效果,僅在SDK23才顯示沉浸式。
*/
private void initStatusBar() {
Window win = getWindow();
if (mIsFullScreen) {
win.requestFeature(Window.FEATURE_NO_TITLE);
win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息欄
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 保持屏幕高亮
} else {
//KITKAT也能知足,只是SYSTEM_UI_FLAG_LIGHT_STATUS_BAR(狀態欄字體顏色反轉)只有在6.0纔有效
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
win.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明狀態欄
// 狀態欄字體設置爲深色,SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 爲SDK23增長
win.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
// 部分機型的statusbar會有半透明的黑色背景
win.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
win.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
win.setStatusBarColor(Color.TRANSPARENT);// SDK21
isStatusBarTranslate = true; } } } --------------------- 做者:年少的風 來源:CSDN 原文:https://blog.csdn.net/brian512/article/details/52096445 版權聲明:本文爲博主原創文章,轉載請附上博文連接!