Android-打造沉浸式狀態(tài)欄

一直很喜歡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以下的版本也能很好的適配

![](http://upload-images.jianshu.io/upload_images/1715286-c5617f59df6dd800.png?
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
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)欄變色吧

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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