沉浸式状态栏处理的相关问题

一、防止布局被刘海屏遮挡的处理方式

现在手机上会有很多种刘海屏、水滴屏等状态。有时候不做处理的话布局会被刘海屏遮挡。这里需要用到android:fitsSystemWindows="true"属性。如果无效的话,尝试把布局设置为透明即可。

二、改变Android状态栏的颜色

 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void setStatusBarColor(int statusColor, Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            //取消设置Window半透明的Flag
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //添加Flag把状态栏设为可绘制模式
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            //设置状态栏为透明
            window.setStatusBarColor(Color.TRANSPARENT);
            //如果想要修改标题栏文字可以在这里进行修改
            // setAndroidNativeLightStatusBar(activity, true);//字体修改为深色
        }
    }
  public static void setAndroidNativeLightStatusBar(@NonNull Activity activity, boolean dark) {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                View decor = activity.getWindow().getDecorView();
                if (dark) {
                    decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                }
            }
        } catch (Exception ignore) {

        }
    }

三、fitsSystemWindows与布局的关系

这里的代码解释有问题,暂时删除,具体可以直接使用上述代码或者<style>的方式实现沉浸式。在郭霖的帖子里面写的只需要更改状态栏颜色为透明的话会出现一些其他问题,比较好的方式是,也添加这行代码activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);。该代码加上状态栏透明的代码效果和下文的<style>中设置沉浸式效果一样。具体差异未深究
这里有两种情况;

  1. 假设容器布局也只是传统的布局LinearLayout布局
    如果什么都不做的话。只是使用fitsSystemWindows属性并不会使布局延伸到状态栏上,这里需要配合上面的代码进行处理。但是并不是所有的组件都可以使用fitsSystemWindows来进行修饰。例如View,而非ViewGroup。例如在TextViewImageView上面使用就不会有效果。但是在ViewGroup上面使用就会有效果。
  2. 假设容器布局是CoordinatorLayoutCollapsingToolbarLayoutDrawerLayout这些会有一些另外的情况,这时候不需要使用上面的java代码也能实现沉浸式处理,参考以下链接,
    https://guolin.blog.csdn.net/article/details/123023395。
    另外需要注意的是如果要开启沉浸式状态栏,还要设置style样式,代码设置则不用如此如下:
       <style name="Theme.DesignTest" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    	...
        <!-- Customize your theme here. -->
        <item name="android:windowTranslucentStatus">true</item><!--设置沉浸式状态栏-->
    </style>
    
  3. 假如想给状态栏架上遮罩层的话,可以使用<FrameLayout><LinearLayout>的不会延伸的特性,例如下文的示例代码,该代码并不需要显示声明高度

四、一个常见的例子

结合上述代码,这里实现一种常见的效果
在这里插入图片描述

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#F4F5F7">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/js_bg_result_header"
        app:layout_constraintTop_toTopOf="parent"/>
    <FrameLayout
        android:id="@+id/fl_status"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/sq_black_alpha_30"
        android:fitsSystemWindows="true"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_height="25dp" />

    <TextView
        android:id="@+id/tv_back"
        style="@style/Sqmedium_18_black"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawablePadding="@dimen/sq_dp_8"
        android:fitsSystemWindows="true"
        android:gravity="center_vertical"
        android:minHeight="@dimen/sq_dp_44"
        android:paddingStart="@dimen/sq_dp_12"
        android:text="@string/sq_feed_back"
        android:textColor="@color/sq_black_alpha_80"
        android:textSize="@dimen/sq_sp_16"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/fl_status"
        tools:ignore="RtlSymmetry" />
</androidx.constraintlayout.widget.ConstraintLayout>
  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        setupWindow(this);
        super.onCreate(savedInstanceState);
    }
        private void setupWindow(Activity activity) {
        if (activity != null && activity.getWindow() != null) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            }
        }
    }

五、setDecorFitsSystemWindows

该函数用于表示内容是否超出状态栏和底部操作栏,false为超过

WindowCompat.setDecorFitsSystemWindows(window, false)

六、enableEdgeToEdge()

使用enableEdgeToEdge()也可以做到沉浸式,源自依赖
import androidx.activity.enableEdgeToEdge

androidx.activity:activity:1.8.1@aar

如果不能升级的话使用google的com.google.android.material也是可以的
EdgeToEdgeUtils.applyEdgeToEdge()

七、Fragment

正常来说Fragment也可以使用上述方案实现沉浸式,倘若布局无法出现,可以尝试以下方案
需要注意的是该方案在Fragment中无法使用FrameLayout的特性,可以自己设置高度,或者使用第三方库

八、DialogFragment

如果是对话框的话,那么需要在样式里面去修改,毕竟Dialog和Activity不是一个window。

 <style name="base_dialog_style" parent="android:Theme.Dialog">
        ....
        <item name="android:windowTranslucentStatus">true</item><!--设置沉浸式状态栏-->
    </style>

九、Compose

Android Jetpack Compose 沉浸式状态栏的实现
如果不使用上述链接的解决方式的话,可以使用第六条的解决方案applyEdgeToEdge()。但是该情况下,内容会延伸到状态栏下面,如果需要做到背景延伸,但是内容在状态栏下面,可以使用Modifider..systemBarsPadding()进行高度填充。
可使用方式具体可参考accompanist,这里面不止提供了accompanist的代码还提供了在androidX中可以使用哪些代码

十、参考链接

  1. 沉浸式兼容库:
    更新较新:https://github.com/gyf-dev/ImmersionBar
    长时间未更新:https://github.com/laobie/statusbarutil
  2. WindowInsetsControllerCompat使用,新方式实现状态栏、导航栏、键盘控制
  3. Android开发 WindowInsetsController 窗口控制器
  4. Android 沉浸式状态栏和全面屏遇到刘海屏
  5. Android Detail:Window 篇——WindowInsets 与 fitsSystemBar
  6. Android开发 WindowInsetsController 窗口控制器
  7. 再学一遍android:fitsSystemWindows属性
  8. ANDROID沉浸式状态栏、FITSSYSTEMWINDOWS、标题栏折叠
  9. systemuicontroller(Compose版的状态栏控制)
  10. 在应用中全屏显示内容
  11. android 软键盘动画
  12. Android软键盘遮挡/动画最佳解决方案
  13. WindowInsetsControllerCompat使用,新方式实现状态栏、导航栏、键盘控制
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity沉浸状态栏是指在使用Unity引擎开发应用程序时,可以隐藏或者自定义应用程序的状态栏。在移动设备上,状态栏通常包含手机的信号、电池信息等系统图标。通过实现沉浸状态栏,开发者可以使应用程序在全屏状态下运行,更好地提供用户体验。 在Unity中,实现沉浸状态栏可以通过以下步骤进行: 首先,开发者需要在Unity中创建一个全屏的视图,包括一整块可以占满屏幕的画布。 然后,通过调用Unity的API函数,可以隐藏状态栏。在Android平台上,可以使用Application类的方法SetStatusBarHidden()将状态栏隐藏起来,并且设置为全屏状态。在iOS平台上,可以使用Screen类的方法SetStatusBarHidden()来隐藏状态栏。 此外,也可以自定义状态栏的样,使其与应用程序的设计风格相符。例如,在Android平台上,可以使用Unity提供的插件设置状态栏的颜色、字体颜色等属性。 需要注意的是,沉浸状态栏功能在不同的平台上具有不同的实现方法和限制。为了确保应用程序的兼容性和稳定性,在使用沉浸状态栏的时候,开发者需要根据不同的平台和设备进行适配和测试。 综上所述,Unity沉浸状态栏是通过隐藏或自定义状态栏,在应用程序运行时提供更加全屏的体验。开发者可以通过Unity的API函数实现沉浸状态栏,并根据需要进行定制,提升应用程序的用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值