android 4.4推出的新特性沉浸式狀態(tài)欄,windowTranslucentStatus,4.4與5.0及以上的效果有些不一樣,先上圖:


系統(tǒng)21>api>=19和系統(tǒng)api>=21的狀態(tài)欄會(huì)有些差異,后者是狀態(tài)欄顏色深一點(diǎn)。而4.4以下沒(méi)有這樣的效果,不支持沉浸式。
? ? ? 要實(shí)現(xiàn)這樣的效果,在values-19中:

? ? ? values-21中:

? ? ? 現(xiàn)在在4.4的系統(tǒng)運(yùn)行起來(lái)的效果如下圖,并不是我們想要的。而在5.0及以上的系統(tǒng)運(yùn)行,效果和上面貼的圖一樣。

狀態(tài)欄和toolbar重疊再了一起,在4.4狀態(tài)欄的位置不會(huì)預(yù)留出來(lái),頁(yè)面完全沉浸到了狀態(tài)欄。這時(shí)候需要在布局中加入android:fitsSystemWindows="true"。
設(shè)置在toolbar且EditText獲取焦點(diǎn),效果是這樣的:

設(shè)置到布局的根view,效果是這樣的:


EditText和沉浸式狀態(tài)欄的問(wèn)題,不知道是bug還是什么。但是我們依然有解決的辦法。既要解決沉浸式,又要解決鍵盤(pán)彈出引起的問(wèn)題。
首先解決4.4沉浸式問(wèn)題,系統(tǒng)4.4以上可以獲取到狀態(tài)欄及其高度,通過(guò)new一個(gè)view加到狀態(tài)欄,給view設(shè)置背景色來(lái)達(dá)到效果,同時(shí)也可以達(dá)到5.0的效果,關(guān)鍵代碼如下:
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
View statusBarView =newView(activity);
ViewGroup.LayoutParams lp =newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity));//獲取狀態(tài)欄高度
statusBarView.setBackgroundColor(color);
contentView.addView(statusBarView, lp);
//獲取狀態(tài)欄高度的方法
public static intgetStatusBarHeight(Context context) {
in tresult =0;
int resourceId = context.getResources().getIdentifier("status_bar_height","dimen","android");
if(resourceId >0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
其次,解決toolbar和狀態(tài)欄也被頂上去的問(wèn)題,在AndroidManifest里面設(shè)置android:windowSoftInputMode="adjustResize",這樣還是沒(méi)有效果,在網(wǎng)上查資料,很多人都說(shuō)重寫(xiě)跟布局的fitSysytemWindows方法,然后再在根布局設(shè)置android:fitsSystemWindows="true"就可以解決,但是我經(jīng)過(guò)測(cè)試的結(jié)果,還是會(huì)有這樣的問(wèn)題。最后把toolbar以下的view用scrollview包裹起來(lái),解決了toolbar和狀態(tài)欄被頂出屏幕的問(wèn)題。
? ? ?最終的效果就是文章開(kāi)頭貼的兩張圖的效果。4.4和5.0的區(qū)別是,4.4用了上面的方法著跟toolbar一樣的顏色,而5.0沒(méi)有著色。如果想要統(tǒng)一5.0效果,或者統(tǒng)一4.4的效果,想必大家已經(jīng)知道該怎么做了。
第一次寫(xiě)這樣的文章,若有不對(duì)之處,望各位大神指出。