Android狀態(tài)欄和虛擬導(dǎo)航欄的適配總結(jié)

Android狀態(tài)欄和虛擬導(dǎo)航欄是Android提供的系統(tǒng)級UI,Android允許開發(fā)者通過控制這兩個Bar來實現(xiàn)對應(yīng)用頁面的適配??墒俏以谶m配的過程中卻發(fā)現(xiàn)Android提供的API對某些手機不可用,并不像官方文檔中寫的那樣,因此,在這里總結(jié)一下我在適配過程中發(fā)現(xiàn)的一些問題。一般談到對系統(tǒng)UI的控制,就涉及到兩個方面:布局和顏色,在平時的開發(fā)中也只需要控制這兩點就足夠了。

布局
控制狀態(tài)欄和虛擬導(dǎo)航欄的布局,表示控制它們的顯示和隱藏,Android提供了這方面的API,開發(fā)者只需要設(shè)置以下幾行代碼即可實現(xiàn)顯示或隱藏狀態(tài)欄和虛擬導(dǎo)航欄:

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
              | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

這里需要注意的關(guān)鍵點是設(shè)置標(biāo)志位uiOptions,Android提供了十幾種標(biāo)志位,在平時的開發(fā)中,我們的APP一般而言只有一下3種狀態(tài):

隱藏狀態(tài)欄或虛擬導(dǎo)航欄
狀態(tài)欄或虛擬導(dǎo)航欄半透明,遮掩APP
狀態(tài)欄或虛擬導(dǎo)航欄正常顯示,不遮掩APP
根據(jù)以上3種狀態(tài),對應(yīng)地,我們有以下的設(shè)置:

uiOption 功能 應(yīng)用場景 備注
SYSTEM_UI_FLAG_VISIBLE 默認(rèn)狀態(tài) 主頁等大部分頁面 呼出虛擬導(dǎo)航欄會自動resize
SYSTEM_UI_FLAG_FULLSCREEN 隱藏狀態(tài)欄 錄制視頻,播放電影等 API >= 16
不可單獨使用,否則部分手機頂部有白條
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 半透明狀態(tài)欄 直播,視頻播放頁等 API >= 16
SYSTEM_UI_FLAG_HIDE_NAVIGATION 隱藏虛擬導(dǎo)航欄 錄制視頻,播放電影等 API >= 16
自動resize,觸摸屏幕會自動顯示虛擬導(dǎo)航欄
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 半透明虛擬導(dǎo)航欄,會自動設(shè)置半透明狀態(tài)欄 直播,視頻播放頁等 API >= 16
SYSTEM_UI_FLAG_IMMERSIVE 自動隱藏狀態(tài)欄和虛擬導(dǎo)航欄,并且在bar出現(xiàn)的位置滑動可以呼出bar 播放電影等 API >= 19
SYSTEM_UI_FLAG_IMMERSIVE_STIKY 和上面不同的是,呼出的bar會自動再隱藏掉 電子書等 API >= 19
SYSTEM_UI_FLAG_LAYOUT_STABLE 保持整個View穩(wěn)定,使View不會因為System UI的變化而重新layout API >= 16沒發(fā)現(xiàn)作用

在這個列表中,有幾個需要注意的地方:
在某些手機上隱藏狀態(tài)欄的標(biāo)志SYSTEM_UI_FLAG_FULLSCREEN會失效,因為我用華為、Nexus和小米分別設(shè)置了這個標(biāo)志,發(fā)現(xiàn)只有小米的設(shè)置才起作用,其它兩類手機當(dāng)隱藏掉狀態(tài)欄時狀態(tài)欄的位置會顯示白條,APP的內(nèi)容不會頂上去,如果有知道原因的同學(xué)麻煩告知下。因此,當(dāng)需要隱藏掉狀態(tài)欄時,推薦使用以下代碼進(jìn)行設(shè)置,或者結(jié)合SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN來設(shè)置:
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN)
在設(shè)置隱藏虛擬導(dǎo)航欄的標(biāo)志的時候,如果結(jié)合
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION可保持原來的布局,如果結(jié)合SYSTEM_UI_FLAG_IMMERSIVE觸摸屏幕不會彈出虛擬導(dǎo)航欄
SYSTEM_UI_FLAG_IMMERSIVE和SYSTEM_UI_FLAG_IMMERSIVE_STIKY
需要結(jié)合SYSTEM_UI_FLAG_FULLSCREEN或者SYSTEM_UI_FLAG_HIDE_NAVIGATION一起使用,才能得到列表中展示的效果
SYSTEM_UI_FLAG_LAYOUT_STABLE沒發(fā)現(xiàn)具體的效果,如果僅僅是為了保持布局,那么
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION也可以做到
另外,我們經(jīng)常用到的fitSystemWindows只有在設(shè)置了半透明狀態(tài)欄或者半透明虛擬導(dǎo)航欄中才有意義,它的作用是為你的APP騰出空間,將界面展示在狀態(tài)欄下方和虛擬導(dǎo)航欄上方,從而不被狀態(tài)欄和虛擬導(dǎo)航欄遮擋。

顏色
狀態(tài)欄和虛擬導(dǎo)航欄的顏色相對于布局設(shè)置來說比較容易,如下表所示:
API版本 狀態(tài)欄 虛擬導(dǎo)航欄
<19 無法設(shè)置 無法設(shè)置
19<=API<21 使用開源項目SystemBarTintManager 無法設(shè)置

= 21 getWindow().setStatusBarColor(color); getWindow().setNavigationBarColor(color);

這里同樣有幾點需要注意的地方:
在19到21的API中,Android還沒有提供設(shè)置狀態(tài)欄顏色的API,因此我們使用了SystemBarTintManager這個開源項目,但是這個項目卻不適用于設(shè)置虛擬導(dǎo)航欄顏色,因為該項目實際上是設(shè)置了透明狀態(tài)欄和虛擬導(dǎo)航欄后再Decorview中添加了上下兩個view,通過這兩個設(shè)置這兩個view來達(dá)到設(shè)置狀態(tài)欄和虛擬導(dǎo)航欄顏色的目的。在很多國產(chǎn)手機,虛擬導(dǎo)航欄是可手動隱藏的,當(dāng)手動隱藏掉虛擬導(dǎo)航欄后,導(dǎo)航欄原來的位置會顯示一條你設(shè)置的顏色的矩形區(qū)域
在API>=21的版本中,設(shè)置狀態(tài)欄和虛擬導(dǎo)航欄的顏色的同時,還需要保證沒有進(jìn)行對它們進(jìn)行過透明化的操作,通過以下設(shè)置可清楚透明設(shè)置:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

————————————————
版權(quán)聲明:本文為CSDN博主「leogentleman」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/leogentleman/article/details/54566319

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容