Android 沉浸式状态栏设置

·  阅读 803

平常在写一个新demo的时候,总是因为设置沉浸式效果而搞了很久,因为网上的很多说法都并不是完全正确,最后不了了之,放任不管去做其他功能了。现在自己记录下来一套正确的设置方法,方便之后的查阅。

第一步:在Activity的onCreate方法中加入下面这行代码

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
复制代码

这行代码要在super.onCreate(savedInstanceState);之前调用,不然会报错

第二步:自定义一个沉浸式主题

<!-- values -->
<style name="ImmersiveTheme" parent="(application所使用的全局主题名称)">
    <item name="windowNoTitle">true</item>
</style>

<!-- values-v19 -->
<style name="ImmersiveTheme" parent="(application所使用的全局主题名称)">
    <!-- 下面两条属性是Android 4.4版本以上才能设置 -->
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="windowNoTitle">true</item>
</style>
    
<!-- values-v21 -->
<style name="ImmersiveTheme" parent="(application所使用的全局主题名称)">
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <!-- 下面这条属性是Android 5.0版本以上才能设置 -->
    <!-- 从Android 5.0开始需要把颜色设置为透明,否则导航栏会呈现系统默认的浅灰色 -->
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="windowNoTitle">true</item>
</style>
复制代码

第三步:在Activity的xml文件中设置android:fitsSystemWindows="true"

<LinearLayout
    ......
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ......
        android:fitsSystemWindows="true">
        <Toolbar
            ......
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize">
            <TextView
                ......
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            ......
        </Toolbar>
        ......
    </LinearLayout>
    ......
</LinearLayout>
复制代码

如上所示,将所有会与状态栏接触的顶部控件都使用一个Layout包装起来,给这个Layout设置属性android:fitsSystemWindows="true"。注意不要给根布局设置这个属性。

(如果xml文件中使用到了include标签,则属性android:fitsSystemWindows="true"需要设置在include所引用的xml文件的根布局上,不要设置在include标签上)

第四步:在AndroidManifest.xml中设置沉浸式主题

<!-- 全局设置 -->
<application
        ......
        android:theme="@style/ImmersiveTheme">
        ......
</application>

<!-- Activity设置 -->
<activity
    ......
    android:theme="@style/ImmersiveTheme">
    ......
</activity>
复制代码

总结

经过这样设置之后,状态栏的背景颜色就会随着Activity的根布局背景颜色而变化。状态栏的文字颜色默认就为白色。

分类:
Android
标签: