android 透明栏设置,也叫沉浸式状态栏

简单看下效果吧

最后更新,因为我发现方法一二有个小弊端,就是当有输入法的时候,关闭输入法会闪一下背景色再关闭,虽然很短,但是我是强迫症,所以建议直接使用方法三,且方法三是官方5.0出品,稳定,高效,也没有再见到那个闪一下背景色了,开心。

设置方法一

1.首先在style.xml里面自定义一个TransparentBar

    <style name="AppTheme.TransparentBar">
        <item name="windowNoTitle">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
        <item name="android:statusBarColor" tools:ignore="NewApi">@android:color/transparent</item>
    </style>

2.然后这时候运行代码会发现状态栏和toolbar会重合一部分,所以还需要在最外层布局加上这两句来调整这个间距,

android:fitsSystemWindows="true"
android:clipToPadding="true"

3.这时候已经差不多ok了,不过运行代码会发现状态栏颜色不太对,因为这时候状态栏颜色已经是最外层的布局颜色了,所以为了整体效果,还需要在最外层加上和toolbar一样的颜色(或者设置任意你想要的颜色试试),

android:background="@color/colorPrimary"

4.同样为了达到理想效果,还需要给里面包裹的自己需要的布局加上UI给的颜色,白色或者什么,附上整个布局代码:

<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:gravity="center_horizontal"
    android:fitsSystemWindows="true"
    android:clipToPadding="true"
    android:background="@color/colorPrimary"
    android:orientation="vertical"
    tools:context=".activity.LoginActivity">
    <android.support.v7.widget.Toolbar
        android:id="@+id/id_toolbar"
        app:title="Log in"
        app:titleTextColor="@color/white"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:background="?attr/colorPrimary"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <AutoCompleteTextView
                android:id="@+id/atv_email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/prompt_email"
                android:inputType="textEmailAddress"
                android:maxLines="1"
                android:singleLine="true" />

            <EditText
                android:id="@+id/et_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/prompt_password"
                android:imeActionId="6"
                android:imeActionLabel="@string/action_login"
                android:imeOptions="actionUnspecified"
                android:inputType="textPassword"
                android:maxLines="1"
                android:singleLine="true" />

            <Button
                android:id="@+id/btn_login"
                style="?android:textAppearanceSmall"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:text="@string/action_login"
                android:textStyle="bold" />
            <Button
                android:id="@+id/btn_sign_up"
                style="?android:textAppearanceSmall"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:text="@string/action_sign_up"
                android:textStyle="bold" />

        </LinearLayout>
    </ScrollView>
</LinearLayout>

方法二

设置style.xml里的去掉title设定,

<item name="windowNoTitle">true</item>

其他的直接去java代码里设置;

     在setContentView()后添加

if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }

其他步骤同方法一。

方法三

1.先设置styles.xml,去掉系统title:

    <style name="AppTheme.TransparentBar">
        <item name="windowNoTitle">true</item>
    </style>

2.然后加入代码:

/**
* 设置状态栏颜色
*/
Window window = getWindow();
//取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏颜色
window.setStatusBarColor(getColor(R.color.colorPrimary));

这几行代码可以放到BaseActivity里面,方便实用。

3.照样在最外层xml布局添加属性:

android:fitsSystemWindows="true"
android:clipToPadding="true"

方法说明,这个直接动态改变状态栏颜色的代码只支持android版本5.0后,现在18年都过了一半多了,估计没有特殊情况就不需要兼容5.0以前了吧,如果一定要去兼容,网上还有很多资料,祝你好运!

猜你喜欢

转载自blog.csdn.net/you943047219/article/details/81291539
今日推荐