美文网首页Android开发Android开发经验谈Android开发
Android Fragment 实现状态栏透明(沉浸式)

Android Fragment 实现状态栏透明(沉浸式)

作者: d74f37143a31 | 来源:发表于2018-12-25 22:31 被阅读2次

来两张效果图对比一下

透明状态栏.png 非透明状态栏.png

第一张图是实现了透明状态栏的效果,第二张图是未实现透明状状态栏。如果还看不出区别,那么请打开手机淘宝和任一手机银行App对比顶部的颜色。

现在好多手机已经是全面屏了,如果我们的应用在顶部还是多出来这么一块黑条,那多不美观啊(APP 主题色是黑色的略过)

那么如何实现?我这里由于项目集成了 statusbarutil所以直接就参考了他例子中的代码来实现了。

StatusBarUtil 地址
StatusBarUtil 在 Fragment 使用

实现

  1. 导包
    compile 'com.jaeger.statusbarutil:library:1.4.0'
  2. 设置 NoActionBar的主题( 我这里实现了右滑返回,所以设置背景为透明)
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:textAllCaps">false</item>
        <item name="android:windowActionBar">false</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowAnimationStyle">@style/AnimationActivity</item>
        <item name="windowNoTitle">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>
  1. 区别不同版本对待
    新建一个res/values-v19目录,在目录下创建一个dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="statusbar_view_height">25dp</dimen>
</resources>

在原先的res/values目录下的dimens.xml也添加statusbar_view_height

<dimen name="statusbar_view_height">0dp</dimen>
  1. 给头部带去一些色彩

我这里是首页实现 透明状态栏,而首页是由一个 Activity + 4 个 Fragment 组成的。这里我们只需要将 Activity状态栏透明即可,在Fragment中可动态设置是否需要透明状态栏。

比如我的首页,顶部是显示图片,我想它顶部状态栏要透明,可以这么做。

第一步:在布局文件的顶部加上<LinearLayout></LinearLayout>中的控件

 <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:contentScrim="@color/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
            <com.youth.banner.Banner
                android:id="@+id/banner"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                app:layout_scrollFlags="scroll|snap"
                app:layout_collapseMode="parallax" />

            <android.support.v7.widget.Toolbar
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                app:layout_collapseMode="pin"
                app:contentInsetStart="0dp">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                    <View
                        android:id="@+id/fake_status_bar"
                        android:layout_width="match_parent"
                        android:layout_height="@dimen/statusbar_view_height"
                        android:background="@color/colorPrimary"/>
                    <TextView
                        android:id="@+id/search_layout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:minHeight="40dp"
                        android:gravity="center"
                        android:hint="@string/search_hint_txt"
                        android:paddingStart="10dp"
                        android:paddingEnd="10dp"
                        android:background="@drawable/home_search_bg_shape"/>
                </LinearLayout>

            </android.support.v7.widget.Toolbar>

        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

idfake_status_barView控件是为了适配顶部的状态栏
idsearch_layoutView控件是顶部的搜索框

第二步:在 fragment 中再设置状态栏的颜色为透明

// 透明顶部
setTvTitleBackgroundColor(Color.TRANSPARENT);

public void setTvTitleBackgroundColor(@ColorInt int color) {
   fakeStatusBar.setBackgroundColor(color);
}

再比如我的其他页面顶部只想显示 App 的主题色,可以这么做。

设置状态栏颜色.png

直接在布局文件中设置 idfake_status_bar控件的背景色为主题色即可。

 <LinearLayout
        android:id="@+id/layout_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <View
            android:id="@+id/fake_status_bar"
            android:layout_width="match_parent"
            android:layout_height="@dimen/statusbar_view_height"
            android:background="@color/colorPrimary"/>
        <TextView
            android:id="@+id/tv_project_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"
            android:text="我是 Toolbar "
            android:textColor="@color/white"
            android:textSize="18sp"
            android:gravity="center"
            android:background="@color/colorPrimary"/>
    </LinearLayout>

喜欢文章的话点下文章底部小心心

本文完,欢迎你留言讨论。

相关文章

网友评论

    本文标题:Android Fragment 实现状态栏透明(沉浸式)

    本文链接:https://www.haomeiwen.com/subject/yjmqlqtx.html