最近為了迎合設(shè)計的要求铃芦,要給項目中添加沉浸式狀態(tài)欄。
一開始我是拒絕的襟雷,因為這事雖然沒做過刃滓,但也聽過,各種兼容問題耸弄。= =但是設(shè)計強烈要求啊咧虎,并拿出某京某寶說為什么別人能做。 最后決定只管5.0以上的手機计呈。
唉~ 雖然說只管5.0手機 但是低版本的手機還是要做判斷的嘛砰诵。不能因為設(shè)計說不管就不做啊 對吧。
既然要做低版本兼容捌显,首先要考慮的就是我們APP頂部標題欄的高度問題啦
直接上代碼:
這里只根據(jù)本人項目中所需進行適配茁彭。因本人頂部Title是LinearLayout ,所以這里只做LinearLayout 的
public void setTitleHeight(LinearLayout lystateTop){
//只兼容5.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) lystateTop.getLayoutParams();
//原本是計劃通過margin 實現(xiàn)的扶歪,但是這樣會使透明的導(dǎo)航欄變白色尉间,與實際想要的效果相沖突
// layoutParams.setMargins(0, getstateH(), 0, 0);
layoutParams.height = layoutParams.height+getstateH();
lystateTop.setLayoutParams(layoutParams);
lystateTop.setPadding(0, getstateH(), 0, 0);
}
}
public int getstateH() {
try {
Class<?> clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height").get(object).toString());
return getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
return 50;
}
接下來是讓那個項目實現(xiàn)透明度的狀態(tài)欄,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//透明狀態(tài)欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明導(dǎo)航欄击罪,底部導(dǎo)航欄 ,因設(shè)計需求贪薪,底部導(dǎo)航欄不做媳禁,所以這里要注釋,否則與華為底部導(dǎo)航欄沖突
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
接下來就是在布局文件中加入以下兩行代碼:
android:fitsSystemWindows="true"
android:clipToPadding="true"
這樣就實現(xiàn)了我們想要的沉浸式效果了画切。
是不是覺得 輕輕松松竣稽,so easy?
對的一度我自己都以為做好了,并用錘子霍弹、360毫别、小米進行測試,一切順利典格。
但是 但是岛宦,別忘了 它們都沒有虛擬建啊。
當我另一個同事拿出華為手機的時候耍缴,狀況出現(xiàn)了砾肺。
當手動切換虛擬建的時候挽霉,狀態(tài)欄變灰了,不透明了变汪。
what ? 然后往上滑動的時候侠坎,發(fā)現(xiàn)這透明欄是好的。但是回滾到原位的時候裙盾,這個狀態(tài)欄始終是灰色实胸。
這樣可不行啊,根本就跟沉浸式不搭邊了嘛番官。甚至連主題色都不是庐完,這就尷尬了。
......
......
......
以上省略N字鲤拿。
最后是直接再根目錄下添加一個View 并設(shè)置
android:fitsSystemWindows="true"
android:clipToPadding="true"
兩個屬性假褪,完美解決了華為底部導(dǎo)航欄 切換隱藏和顯示 導(dǎo)致的狀態(tài)欄不對的情況,這里因為是直接公司的項目就不貼效果圖了近顷。: