当前位置: 首页 > article >正文

Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色

推荐:https://github.com/gyf-dev/ImmersionBar

在 Android 中要实现特定 Activity 内容顶部显示在状态栏底部以及封装方法修改状态栏颜色,可以通过以下步骤来完成:

一、让 Activity 内容显示在状态栏底部

  1. 在 AndroidManifest.xml 文件中,为特定的 Activity 设置主题,主题中可以设置窗口属性,使得状态栏透明: 
<activity android:name=".YourActivity"
          android:theme="@style/TransparentStatusBarTheme">
</activity>

创建一个主题样式文件 styles.xml(如果已有则在其中添加):
 

<style name="TransparentStatusBarTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
</style>

 Activity 的布局文件根布局中设置 fitsSystemWindows 属性为 true,这样可以让布局适应系统窗口,包括状态栏: 
 

  1. 在 Activity 的 onCreate 方法中,通过代码设置状态栏透明:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.TRANSPARENT);
}

二、封装修改状态栏颜色的方法

  1. 创建一个工具类 StatusBarUtils: 

public class StatusBarUtils {
    public static void setStatusBarColor(Activity activity, int color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(color);
        }
    }
}

  1. 在需要修改状态栏颜色的地方调用这个方法:

StatusBarUtils.setStatusBarColor(this, Color.RED); // 将状态栏颜色设置为红色

通过以上步骤,就可以实现特定 Activity 内容顶部显示在状态栏底部,并可以方便地通过封装的方法修改状态栏颜色。


import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class StatusBarUtils {

    /**
     * StatusBarUtils.setStatusBarColor(this, Color.RED); // 将状态栏颜色设置为红色
     */
    public static void setStatusBarColor(Activity activity, int statusBarBgcolor, boolean isLightStatus) {
        Window window = activity.getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(statusBarBgcolor);
        View decorView = window.getDecorView();
        int flags = decorView.getSystemUiVisibility();
        if (isLightStatus) {
            // 设置为浅色模式(黑色文字)
            flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        } else {
            // 设置为深色模式(白色文字)
            flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        }
        decorView.setSystemUiVisibility(flags);
    }

    /**
     * 判断当前活动的状态栏是否为浅色。
     *
     * @param activity 活动实例
     * @return 如果状态栏为浅色,返回 true;否则返回 false。
     */
    private static boolean isLightStatusBar(Activity activity) {
        try {
            View decorView = activity.getWindow().getDecorView();
            int flags = decorView.getSystemUiVisibility();
            return (flags & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    private static void setLightStatusBar(Activity activity, boolean isLightStatus) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isLightStatus != isLightStatusBar(activity)) {
            View decorView = activity.getWindow().getDecorView();
            int flags = decorView.getSystemUiVisibility();
            if (isLightStatus) {
                flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
            } else {
                flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
            }
            decorView.setSystemUiVisibility(flags);
        }
    }


}


http://www.kler.cn/news/360376.html

相关文章:

  • Modbus TCP报错:Response length is only 0 bytes
  • github多个账号配置多个SSH秘钥
  • 在分类内用最大最小值筛选(每个分类找出一个)
  • 2011年国赛高教杯数学建模D题天然肠衣搭配问题解题全过程文档及程序
  • Python GUI 编程:tkinter 初学者入门指南——复选框
  • 归一化——5种方法详细分类说明
  • 重庆大学软件工程考研,难度如何?
  • Linux -- 进程间通信、初识匿名管道
  • Java项目-基于springcloud框架的分布式架构网上商城系统项目实战(附源码+文档)
  • OceanBase 的写盘与传统数据库有什么不同?
  • 一个检测work是否被包含在训练数据集中的工具
  • Spring-aop介绍
  • Adobe Acrobat DC 打印PDF文件,没有打印出注释的解决方法
  • 【Linux】文件IO深度解析:文件描述符与重定向的奥秘
  • LeetCode 1456.定长子串中元音的最大数目
  • ESP32移植Openharmony外设篇(1)MQ-2烟雾传感器
  • 独著的出版流程是怎样的?
  • rabbitMQ消息重复问题怎么解决的?
  • API 接口封装技术详解
  • 【JVM】—深入理解ZGC回收器—关键技术详解