APP开发_ js 控制手机是否显示状态栏

1 Android 控制手机显示或隐藏状态栏的方法

1.1 使用 View 的 setSystemUiVisibility 方法

这个方法允许设置系统 UI 的可见性,包括状态栏。你可以通过组合不同的标志来实现不同的效果。

示例代码:

@Override  
protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  // 获取DecorView,这是Activity的最顶层视图  View decorView = getWindow().getDecorView();  // 设置系统UI的可见性  int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; // 隐藏状态栏  decorView.setSystemUiVisibility(uiOptions);  
}

常用的标志:

  • View.SYSTEM_UI_FLAG_FULLSCREEN: 隐藏状态栏。
  • View.SYSTEM_UI_FLAG_HIDE_NAVIGATION: 隐藏导航栏。
  • View.SYSTEM_UI_FLAG_IMMERSIVE: 沉浸式模式,允许用户通过滑动屏幕边缘来显示系统栏。
  • View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY: 类似于 IMMERSIVE,但系统栏在显示后会短暂延迟隐藏。

1.2 使用 Window 的 addFlags 和 clearFlags 方法

可以通过Window对象来添加或清除特定的窗口标志,从而控制状态栏的显示。

示例代码:

@Override  
protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  // 获取Window对象  Window window = getWindow();  // 隐藏状态栏  window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  // 如果需要再次显示状态栏  // window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  
}

1.3 处理状态栏的重新显示

在某些情况下,如用户滑动屏幕或收到通知,状态栏可能会重新显示。为了确保用户体验的连贯性,你可能需要在onWindowFocusChanged方法中监听窗口焦点的变化,并相应地调整系统UI的可见性。

示例代码:

@Override  
public void onWindowFocusChanged(boolean hasFocus) {  super.onWindowFocusChanged(hasFocus);  if (hasFocus) {  View decorView = getWindow().getDecorView();  decorView.setSystemUiVisibility(  View.SYSTEM_UI_FLAG_LAYOUT_STABLE  | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // 隐藏导航栏  | View.SYSTEM_UI_FLAG_FULLSCREEN // 隐藏状态栏  | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); // 沉浸式模式  }  
}

1.4 使用 WindowInsetsController 类

在 Android 开发中,随着版本的更新,API 也提供了更加灵活和强大的方法来控制状态栏的显示或隐藏。从 Android R(API级别30)开始,引入了 WindowInsetsController 类,它提供了一种更直观和强大的方式来控制窗口插入(包括状态栏和导航栏)的可见性。

使用 WindowInsetsController,可以实现更精细的控制,比如平滑地隐藏或显示状态栏,以及处理用户与这些系统 UI 元素的交互。

(1)获取 WindowInsetsController 实例

首先,需要在 Activity 或 Fragment 中获取 WindowInsetsController 的实例。这通常通过 Window 对象来实现。

WindowInsetsController controller;  
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {  controller = getWindow().getInsetsController();  
}

确保检查 API 级别,因为 WindowInsetsController 只在 API 级别 30 及更高版本中可用。

(2)控制状态栏的显示或隐藏
一旦有了 WindowInsetsController 的实例,就可以使用它来控制状态栏的显示或隐藏了。

  • 隐藏状态栏
if (controller != null) {  controller.hide(WindowInsets.Type.statusBars());  
}
  • 显示状态栏
if (controller != null) {  controller.show(WindowInsets.Type.statusBars());  
}

(3)设置状态栏的行为和外观

除了基本的显示和隐藏,WindowInsetsController 还允许设置状态栏的行为和外观。

  • 设置状态栏的外观

可以使用 setAppearanceLightStatusBars 和 setAppearanceDarkStatusBars 方法来改变状态栏的颜色模式。

if (controller != null) {  // 设置状态栏为亮色模式  controller.setAppearanceLightStatusBars(true);  // 或者设置为暗色模式  controller.setAppearanceDarkStatusBars(true);  
}
  • 设置状态栏的隐藏模式

还可以设置状态栏隐藏时的行为模式,比如是否允许用户通过滑动来显示状态栏。

if (controller != null) {  // 设置沉浸式模式,允许用户通过滑动来显示状态栏  controller.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);  
}

(4)监听状态栏的变化

可以添加监听器来监听状态栏的变化,以便在状态栏显示或隐藏时执行特定的操作。

if (controller != null) {  controller.addOnControlVisibilityChangeListener(new View.OnControlVisibilityChangeListener() {  @Override  public void onControlVisibilityChange(ControlVisibility controlVisibility) {  if (controlVisibility.statusBars == ControlVisibility.VISIBLE) {  // 状态栏变为可见  } else {  // 状态栏变为隐藏  }  }  });  
}

2 提供 js 调用 Android 方法

重点注意:需要通过异步的方式调用显示或隐藏状态栏的方法,否则 JS 会报错,并且设置失败。

(1)创建 JavaScriptInterface 类

首先,需要创建一个 Java 类,实现 WebView.JavascriptInterface 接口。这个类将作为 JavaScript 和 Android 原生代码之间的桥梁。

import android.content.Context;
import android.webkit.JavascriptInterface;
import android.widget.Toast;public class WebAppInterface {Context mContext;/** Instantiate the interface and set the context */WebAppInterface(Context c) {mContext = c;}// 隐藏系统栏@JavascriptInterfacepublic void hideSystemUI() {executorService = Executors.newSingleThreadExecutor();Future<String> future = executorService.submit(new Callable<String>() {@Overridepublic String call() throws Exception {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {WindowInsetsController controller = ((Activity) mContext).getWindow().getInsetsController();if (controller != null) {// 隐藏状态栏controller.hide(WindowInsets.Type.statusBars());// 如果你想在用户交互后自动显示系统栏,可以使用SYSTEM_BARS_BEHAVIOR_SHOW_TRANSIENT_BARS或SYSTEM_BARS_BEHAVIOR_SHOW_BARS_BY_SWIPE// controller.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);}}return "";}});try {// 当需要结果时,阻塞等待Future完成String result = future.get();System.out.println("异步操作结果: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {executorService.shutdown(); // 关闭ExecutorService}}// 显示系统栏@JavascriptInterfacepublic void showSystemUI() {executorService = Executors.newSingleThreadExecutor();Future<String> future = executorService.submit(new Callable<String>() {@Overridepublic String call() throws Exception {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {WindowInsetsController controller = ((Activity) mContext).getWindow().getInsetsController();if (controller != null) {// 显示状态栏controller.show(WindowInsets.Type.statusBars());}}return "";}});try {// 当需要结果时,阻塞等待Future完成String result = future.get();System.out.println("异步操作结果: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {executorService.shutdown(); // 关闭ExecutorService}}
}

注意,@JavascriptInterface 注解是必须的,该注解允许 Android 识别哪些方法可以被 JavaScript 调用。

(2)在 WebView 中启用 JavaScript 并添加接口

然后,在 Activity 或 Fragment 中,需要初始化 WebView,启用 JavaScript,并将创建的 JavaScriptInterface 实例添加到 WebView 中。

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private WebView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webView = findViewById(R.id.webview);webView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(new WebAppInterface(this), "Android");webView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}});// 加载一个HTML页面,或者直接使用webView.loadDataWithBaseURL()加载包含JavaScript的字符串webView.loadUrl("file:///android_asset/my_page.html");}
}

这里,addJavascriptInterface 方法的第一个参数是 JavaScriptInterface 的实例,第二个参数是 JavaScript 中用来访问这个接口的对象名(这里使用了 “Android”)。

(3)在 HTML 中调用 Android 设置显示或隐藏状态栏的方法

在 HTML 页面中,即可以使用 JavaScript 来调用 Android 方法。

<!DOCTYPE html>
<html>
<head><title>WebView JavaScript Interface Example</title><script type="text/javascript">function hideSystemUI() {// 调用Android方法Android.hideSystemUI();}function showSystemUI() {// 调用Android方法Android.showSystemUI();}</script>
</head>
<body><h1>WebView JavaScript Interface Example</h1><button onclick="hideSystemUI()">隐藏状态栏</button><button onclick="showSystemUI()">显示状态栏</button>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给字符串添加加粗标签(AC自动机+Python)

可以暴力解决&#xff0c;但是为了锻炼一下ac自动机的编程&#xff0c;我们使用ac自动机。 ac自动机主要维护两个列表&#xff0c;一个列表ch&#xff0c;ch[f][idx]表示从父节点f向idx这个方向走&#xff0c;走到的节点。另一个列表nex&#xff0c;nex[i]表示节点i回跳边的节…

01 【哈工大_操作系统】x86_64 常用寄存器大全

在学习CPU底层技术的时候&#xff0c;难免会接触到各式各样的寄存器。尤其是在使用汇编语言编写操作系统时&#xff0c;寄存器更是必不可少的。因此&#xff0c;这篇文章将来详细聊聊 x86_64 架构中的所有寄存器&#xff0c;按照从 常用->不常用 的顺序来进行介绍。 首先&a…

操作系统的特性

操作系统的性质 并发性 操作系统支持多道程序设计&#xff0c;即允许多个程序并发执行。通过进程管理和调度机制&#xff0c;操作系统能够在单个处理器上模拟出多个任务同时运行的效果&#xff0c;提高系统资源利用率和用户响应体验。并发性也要求操作系统具备进程同步、互斥和…

Spark-机器学习(4)回归学习之逻辑回归

在之前的文章中&#xff0c;我们来学习我们回归中的线性回归&#xff0c;了解了它的算法&#xff0c;知道了它的用法&#xff0c;并带来了简单案例。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请…

Syncovery for Mac v10.14.3激活版:文件备份和同步工具

Syncovery for Mac是一款高效且灵活的文件备份与同步工具&#xff0c;专为Mac用户设计&#xff0c;旨在确保数据的安全性和完整性。该软件支持多种备份和同步方式&#xff0c;包括本地备份、网络备份以及云备份&#xff0c;用户可以根据实际需求选择最合适的方案。 Syncovery f…

信息系统项目管理师0062:需求分析(5信息系统工程—5.1软件工程—5.1.2需求分析)

点击查看专栏目录 文章目录 5.1.2需求分析1.需求的层次2.需求过程3.UML4.面向对象分析记忆要点总结5.1.2需求分析 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。根据IEEE的软件工程标准词汇表,软件需求是指用户解决问题或达到目标所需的条件或能力,是…

【深度学习】烟雾和火焰数据集,野外数据集,超大量数据集,目标检测,YOLOv5

标注了2w张数据集&#xff0c;是目标检测yolo格式的&#xff0c;有火焰、烟雾两个目标。 训练方法看这里&#xff1a; https://qq742971636.blog.csdn.net/article/details/138097481 打包 依据不一样的需求&#xff0c; 详情请查看 https://docs.qq.com/sheet/DUEdqZ2l…

多元函数泰勒公式(含黑塞矩阵)

一元函数的泰勒公式&#xff1a; 接下来&#xff0c;由一元函数有关知识&#xff0c;我们有: 注意这里的dxn中&#xff0c;应把dx看作一个整体&#xff0c;即一个微小变量的n次方 我们接下来推导微分算子&#xff1a; 接下来&#xff0c;把一元泰勒公式转为微分形式: 对于二元…

React.js 3D开发快速入门

如果你对 3D 图形的可能性着迷&#xff0c;但发现从头开始创建 3D 模型的想法是不可能的 - 不用担心&#xff01; Three.js 是一个强大的 JavaScript 库&#xff0c;它可以帮助我们轻松地将现有的 3D 模型集成到 React 应用程序中。因此&#xff0c;在本文中&#xff0c;我将深…

Linux tcp/ip 网路协议栈学习-00 前言

Linux tcp/ip 网路协议栈学习-00 前言 目录 Linux tcp/ip 网路协议栈学习-00 前言 (1)预备知识 (2)前置知识 (3)学习目标 (4)总结 (1)预备知识 好工具事半功倍&#xff0c;做任何事情都需要有方法和工具&#xff0c;同样&#xff0c;阅读 Linux 内核源码也是如此…

ExcelVBA把当前工作表导出为PDF文档

我们先问问Kimi Excel导出为PDF的方法有多种&#xff0c;以下是一些常见的方法&#xff1a; 1 使用Excel软件的内置功能&#xff1a; 打开Excel文件&#xff0c;点击“文件”菜单。选择“另存为”&#xff0c;在“保存类型”中选择“PDF”。设置保存路径和文件名&#xff0c;点…

【机器学习】重塑汽车设计与制造:实例与代码探索

机器学习重塑汽车设计与制造 一、机器学习在汽车设计中的应用二、机器学习在智能制造与生产中的应用 在数字化浪潮的推动下&#xff0c;机器学习技术正逐步成为汽车行业的创新引擎。从概念设计到智能制造&#xff0c;机器学习正以其独特的优势助力汽车产业的革新与发展。本文将…

数据挖掘实验(Apriori,fpgrowth)

Apriori&#xff1a;这里做了个小优化&#xff0c;比如abcde和adcef自连接出的新项集abcdef&#xff0c;可以用abcde的位置和f的位置取交集&#xff0c;这样第n项集的计算可以用n-1项集的信息和数字本身的位置信息计算出来&#xff0c;只需要保存第n-1项集的位置信息就可以提速…

day06 51单片机-点阵led

1 点阵LED 1.1 需求描述 本案例介绍如何使用点阵LED显示一排由左上到右下的斜线。 1.2 硬件设计 1.2.1 硬件原理图 点阵内部的原理图: 点阵LED的原理也非常简单,就是LED点灯。例如,我们想要让13列(阳极端)9行(阴极端)的LED点亮,需要13为高电平,9为低电平。注意对于…

【Git】git revert 命令(撤销 commit 改动)

基本语法 Git revert命令用于通过创建一个新的commit来撤销一个或多个之前的commit。这样做的好处是保持了项目历史的完整性&#xff0c;并且可以将撤销的改动应用到其他分支。 撤销单个commit&#xff1a;如果你只想撤销一个commit&#xff0c;你可以使用以下命令 git revert…

Oracle进阶(3)——索引、权限、角色管理、分区表

一、索引 在 Oracle 数据库中&#xff0c;索引是一种数据结构&#xff0c;用于加快数据库表的数据检索速度。索引存储着表中一个或多个列的值以及对应的行的物理地址或指针。通过使用索引&#xff0c;数据库可以更快地定位到符合特定条件的行&#xff0c;而不必扫描整个表。索引…

logback添加日志行号

logback打印行号 全量配置如下 在包名后面添加\(%F:%L\\)这样打印的日志是带类名加行号&#xff0c;支持 ide 点击跳转(xxx.main.java:18)精简配置如下 打印全量类占用显示位置去掉主类名直接打印行号%clr(%4.4L{4})这样打印的日志只是加行号解释&#xff1a;%4&#xff1a;这…

【源码】Spring validation参数校验之分组序列校验@GroupSequenceProvider、@GroupSequence的实现原理

Spring validation参数校验系列 1、Spring validation参数校验基本使用 2、Spring validation参数校验之自定义校验规则及编程式校验等进阶篇 3、Spring validation参数校验原理解析之Controller控制器参数校验中RequestBody参数校验实现原理 4、Spring validation参数校验…

苍穹外卖day8(2)用户下单、微信支付

文章目录 前言一、用户下单1. 业务流程2. 接口设计3. 数据库设计3.1 订单表orders3.2 订单明细表 order_detail 4. 代码实现 二、订单支付 前言 用户下单 因为订单信息中包含了其他业务中的数据&#xff0c;在逻辑处理中涉及了多个其他业务&#xff0c;比如要判断地址簿、购物…

描述一下PHP与HTML和CSS的关系

描述一下PHP与HTML和CSS的关系 PHP、HTML和CSS在Web开发中各自扮演着不同的角色&#xff0c;它们之间的关系密切而互补&#xff0c;共同构建了一个完整且富有动态性的Web应用程序。下面我将详细阐述PHP与HTML和CSS之间的关系。 首先&#xff0c;HTML&#xff08;HyperText Ma…