一直很喜歡QQ的TopBar延伸至狀態(tài)欄的感覺,網(wǎng)上關(guān)于這個叫沉浸式狀態(tài)欄還是半透明狀態(tài)欄有很多爭議,我也不管這么多了,只要好看就行了,所以就叫沉浸式狀態(tài)欄吧。自己寫了一個,效果如下:
-
5.0模擬器的效果
-
4.4模擬器的效果
首先只有Android4.4及其以上的版本才支持這個沉浸式狀態(tài)欄,其次我們可以發(fā)現(xiàn)5.0版本并非一個漸進(jìn)的效果,而是一個更深一點的顏色,有的大神為了更符合MD的規(guī)范,對4.4做了適配,我這里偷個懶,就不做適配工作了。
好,廢話不多說,現(xiàn)在就開始一步一步實現(xiàn)沉浸式狀態(tài)欄的效果。
1.因為android:windowTranslucentStatus這個屬性是Android4.4及其以上版本才有的,在res目錄下新建values-19文件夾,并自定義一個style
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="@style/BaseAppTheme">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
2.activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.MainActivity"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/toolbar_padding_top"
android:background="@color/top_bar_color"> //這里設(shè)置TopBar的背景色
<com.houxy.wechat.view.CircleImageView //這里是自定義的一個控件,就是上面的圓形頭像
android:layout_width="35dp"
android:layout_height="35dp"
android:src="@mipmap/default_head"
android:textColor="@color/base_color_text_white"
android:layout_centerInParent="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="@dimen/margin_15"/>
</android.support.v7.widget.Toolbar>
</LinearLayout>
這里我們需要特別注意android:paddingTop這個屬性,我們來看看如果不加會怎么樣!
-
4.4模擬器的效果
-
5.0模擬器的效果
Paste_Image.png
明顯可以看到TopBar和狀態(tài)欄像是擠到一起去了。我最開始的解決方案是給toolbar加上
android:fitsSystemWindows="true"這個屬性。
沒錯,一般情況下這樣就能解決這個bug,但是如果我們給這個活動添加一個搜索框,我們就會發(fā)現(xiàn)

出現(xiàn)了這個bug,我想應(yīng)該是輸入法的彈出,導(dǎo)致view的變化吧,所以添加
android:fitsSystemWindows="true"這個屬性是有風(fēng)險的.最后我的解決方案是給topbar添加一個paddingTop,而不是添加android:fitsSystemWindows="true"這個屬性。為了適配,我們在valeus/dimens.xml的文件下定義
<dimen name="toolbar_padding_top">0dp</dimen>
在values-v19/dimens.xml的文件下定義
<dimen name="toolbar_padding_top">25dp</dimen>
至于為什么這toolbar_padding_top=25dp,這個是因為我們的狀態(tài)欄的高度為這么多。加上這個padding_top就把我們的toolbar從狀態(tài)欄上擠下來了。
-
加上paddingTop后的效果
再也不用擔(dān)心輸入法的彈出對view造成的影響,而且4.4以下的版本也能很好的適配

3.最后在活動里setSupportActionBar就大功告成了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....//省略
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(null);//不要標(biāo)題
}
最近我又發(fā)現(xiàn)一個bug,就是在使用沉浸式狀態(tài)欄的時候,如果底部有editText,點擊它,彈出的輸入法會將editText遮住。

解決方法是在被遮擋住的編輯框所在的根布局添加屬性
android:fitsSystemWindows="true"

參考:Android 沉浸式狀態(tài)欄攻略 讓你的狀態(tài)欄變色吧




