【Launcher3】解决谷歌桌面的小部件重启后消失问题

1-问题摘要

这次主要解决困扰了我很久的时钟消失问题,大概是去年10月刚开始做EDLA项目的时候,需要定制谷歌桌面,桌面布局大概要改成这样:
在这里插入图片描述
时间显示在谷歌搜索框的上方,而安卓原生桌面大概是这样子的
在这里插入图片描述
我们开发一开始是使用小部件的方式加载谷歌时钟显示在桌面,而我们知道,桌面显示的任何组件都是以行和列的形式存在的,当时我们想要改时间为2行3列才能达到预期效果,但是奇怪的是2行3列的时间小部件在开机后并没有显示出来,暂时找不到原因只好使用1行3列布局,大概长这样
在这里插入图片描述

无论是默认定义2行或者是手动调整到2行,重启后时钟都会消失.

二-解决方法

先贴解决方法吧,原因分析写在后面,想看就看
小部件消失一般是跟谷歌搜索框有关,修改路径为Launcher3目录下的src/com/android/launcher3/model/LoaderCursor.java
找到这个方法

    /*** check & update map of what's occupied; used to discard overlapping/invalid items*/protected boolean checkItemPlacement(ItemInfo item) {int containerIndex = item.screenId;if (item.container == Favorites.CONTAINER_HOTSEAT) {final GridOccupancy hotseatOccupancy =mOccupied.get(Favorites.CONTAINER_HOTSEAT);if (item.screenId >= mIDP.numDatabaseHotseatIcons) {Log.e(TAG, "Error loading shortcut " + item+ " into hotseat position " + item.screenId+ ", position out of bounds: (0 to " + (mIDP.numDatabaseHotseatIcons - 1)+ ")");return false;}if (hotseatOccupancy != null) {if (hotseatOccupancy.cells[(int) item.screenId][0]) {Log.e(TAG, "Error loading shortcut into hotseat " + item+ " into position (" + item.screenId + ":" + item.cellX + ","+ item.cellY + ") already occupied");return false;} else {hotseatOccupancy.cells[item.screenId][0] = true;return true;}} else {final GridOccupancy occupancy = new GridOccupancy(mIDP.numDatabaseHotseatIcons, 1);occupancy.cells[item.screenId][0] = true;mOccupied.put(Favorites.CONTAINER_HOTSEAT, occupancy);return true;}} else if (item.container != Favorites.CONTAINER_DESKTOP) {// Skip further checking if it is not the hotseat or workspace containerreturn true;}final int countX = mIDP.numColumns;final int countY = mIDP.numRows;if (item.container == Favorites.CONTAINER_DESKTOP && item.cellX < 0 || item.cellY < 0|| item.cellX + item.spanX > countX || item.cellY + item.spanY > countY) {Log.e(TAG, "Error loading shortcut " + item+ " into cell (" + containerIndex + "-" + item.screenId + ":"+ item.cellX + "," + item.cellY+ ") out of screen bounds ( " + countX + "x" + countY + ")");return false;}if (!mOccupied.containsKey(item.screenId)) {GridOccupancy screen = new GridOccupancy(countX + 1, countY + 1);if (item.screenId == Workspace.FIRST_SCREEN_ID && FeatureFlags.QSB_ON_FIRST_SCREEN) {// Mark the first X columns (X is width of the search container) in the first row as// occupied (if the feature is enabled) in order to account for the search// container.int spanX = mIDP.numSearchContainerColumns;int spanY = 1;screen.markCells(0, 0, spanX, spanY, true);}mOccupied.put(item.screenId, screen);}final GridOccupancy occupancy = mOccupied.get(item.screenId);// Check if any workspace icons overlap with each otherif (occupancy.isRegionVacant(item.cellX, item.cellY, item.spanX, item.spanY)) {occupancy.markCells(item, true);return true;} else {Log.e(TAG, "Error loading shortcut " + item+ " into cell (" + containerIndex + "-" + item.screenId + ":"+ item.cellX + "," + item.cellX + "," + item.spanX + "," + item.spanY+ ") already occupied");return false;}}

这个方法用来判断加载的组件相互之间是否存在布局重叠,如果有布局重叠,则不加载相应的组件
在这里插入图片描述
这行代码标记了谷歌搜索框的位置,从第1行第一列开始,占据spanX列和spanY行的空间,一般spanX在配置文件里定义为5,spanY为1,所以桌面的第一行基本是谷歌搜索框的天下,解决办法要根据你主布局是否需要搜索框来改:
1.如果你的布局不需要谷歌搜索框,就直接把screen.markCells(0, 0, spanX, spanY, true);给注释掉;
2.需要谷歌搜索框的话,就需要保持你桌面搜索框显示的位置和这里一致,查看src/com/android/launcher3/Workspace.java的bindAndInitFirstWorkspaceScreen()方法,里面定义了谷歌搜索框的位置
在这里插入图片描述
比如我这里定义居中的是从第二行第一列开始,占据5列1行空间,所以要把screen.markCells(0, 0, spanX, spanY, true);改为
screen.markCells(1, 2, 5, 1, true);

这样改了之后就不会计算出组件布局重叠区域了,可以正常显示衍生到桌面第一行的小部件,不单单是时钟组件.

三-原理分析

首先分析桌面启动加载小部件流程…未完待续

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

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

相关文章

web刷题记录

[HDCTF 2023]SearchMaster 打开环境&#xff0c;首先的提示信息就是告诉我们&#xff0c;可以用post传参的方式来传入参数data 首先考虑的还是rce&#xff0c;但是这里发现&#xff0c;不管输入那种命令&#xff0c;它都会直接显示在中间的那一小行里面&#xff0c;而实际的命令…

视觉与运动控制6

基于驱动器的控制功能 驱动器的系统性能和运算能力有限需要单独的运动控制器。 V/F恒压频比控制 开环控制方法&#xff0c;应用最广泛、最简单&#xff0c;只需要电机数据即可。适用于控制精度和动态响应要求不高的应用。控制原理&#xff1a;保持点击内磁通量恒定&#xff…

Emacs之显示blame插件:blamer、git-messenger(一百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【ARMv8/v9 GIC 系列 2.3 -- GIC SPI 中断的 GICD_CLRSPI_NSR寄存器】

文章目录 GICD_CLRSPIN_NSR寄存器功能INTID 位 [12:0]中断触发类型的影响小结 GICD_CLRSPIN_NSR 在 ARMv9 架构下&#xff0c;GIC&#xff08;Generic Interrupt Controller&#xff09;是负责中断管理的关键组件&#xff0c;它支持复杂的中断处理需求&#xff0c;包括多处理器…

免费下载电子书的网站

在如今的数字化时代&#xff0c;电子书已成为许多人书籍阅读的首选。下面小编就和大家分享一些提供免费查找下载电子书服务的网站&#xff0c;这些网站不仅资源丰富&#xff0c;而且操作简便。 免费下载电子书的网站&#xff1a;https://www.bgrdh.com/favorites/1355.html 1…

没有查到相同已注册商标名称,就可以注册下来?

曾聊了许多网友&#xff0c;他们对普推商标知产老杨说&#xff0c;认为没有查到相同已注册商标名称&#xff0c;就可以申请注册成功&#xff0c;其实不是这样的&#xff0c;还要考虑多种因素。 有的商标名称起的很长&#xff0c;是广告语&#xff0c;一检索没有相同&#xff0…

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

net Framework OAuth2.0

安装四个包 密码模式&#xff08;Password Grant&#xff09;&#xff1a; 用户将用户名和密码发送给第三方应用程序&#xff0c;第三方应用程序直接向授权服务器请求访问令牌。

密码学:用随机函数隐藏指纹

英文中e的出现频率高&#xff0c;加密后&#xff0c;频率最高的那个符号代表e。这是历史上的一次真实案例。这些符号的概率&#xff0c;叫做“指纹”。 把e加密成2个符号&#xff0c;用随机函数选择&#xff0c;例如70%概率下选择符号1&#xff0c;30%选择符号2。解密时&#…

Web Worker 学习及使用

了解什么是 Web Worker 提供了可以在后台线程中运行 js 的方法。可以不占用主线程&#xff0c;不干扰用户界面&#xff0c;可以用来执行复杂、耗时的任务。 在worker中运行的是另一个全局上下文&#xff0c;不能直接获取 Window 全局对象。不同的 worker 可以分为专用和共享&…

文心一言使用笔记

目录 让文心一言提炼已有的内容&#xff0c;模仿给出的案例写一段宣传稿方法例子 发现写出的内容有瑕疵&#xff0c;如何微调&#xff1f;比如文心一言介绍的领导不全如何让文心一言检查语法和表达问题&#xff1f; 如何让文心一言将每个片段用一两句话总结&#xff1f;为了防止…

通用性I2C接口的应用之驱动SHT20(N32G45XVL-STB)

目录 概述 1 软硬件接口 1.1 MCU与SHT20接口 1.2 开发软硬件信息 1.3 SHT-20模块电路 2 I2C软件接口实现 2.1 MCU相关接口 2.2 软件接口实现 2.3 初始化struct I2C 3 SHT20驱动程序实现 3.1 SHT20驱动调用I2C接口 ​3.2 驱动源代码文件 4 测试 4.1 测试代码实现…

【Vision Transformers-VIT】: 计算机视觉中的Transformer探索

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Docker中修改TiDB数据库密码(类似mysql)

1.Docker容器运行TiDB pingcap/tidb:last 2.登陆容器系统&#xff1a; 3.在容器中安装mysql客户端&#xff1a; 4.空密码登陆TiDB 5.修改TiDB密码并退出 6.使用修改后的密码登陆验证&#xff1a;

Unity【GUI】基础知识

什么是UI系统 Ul是UserInterface(用户界面)的简称系统的主要学习内容 1.UI控件的使用 2.U控件的事件响应 3.U的分辨率自适应文章目录 基础知识1、工作原理和主要作用2、基本控件1、文本和按钮控件2、多选框和单选框3、输入框和拖动条4、图片绘制和框 3、复合控件1、工具栏和…

DC/AC电源模块:为新能源汽车充电系统提供高效能源转换

BOSHIDA DC/AC电源模块&#xff1a;为新能源汽车充电系统提供高效能源转换 DC/AC电源模块是新能源汽车充电系统中至关重要的组件&#xff0c;它能够将直流电转换为交流电&#xff0c;为电动车提供高效能源转换。随着人们对可持续能源的需求日益增长&#xff0c;新能源汽车成为…

java基于ssm+jsp 足球赛会管理系统

1前台首页功能模块 足球赛会管理系统&#xff0c;在系统首页可以查看首页、球队介绍、球星介绍、线下足球赛、论坛信息、个人中心、后台管理、在线客服等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户登录、用户注册&#xff0c;在注册页面可以填写账号、密码、姓名…

【sqlmap命令学习及测试dvwa_SQL_Injection】

文章目录 1.sqlmap命令及 不同级别探索 能否注入命令option1.1 low等级1.2 Medium等级1. 3 High等级 2. 注入流程2.1 数据库2.2 指定数据库表名2.3 指定表的 字段名2.4 内容2.5 当前用户信息2.6 用户密码2.7 其他 1.sqlmap命令及 不同级别探索 能否注入 命令option sqlmap -u…

昇思25天学习打卡营第2天|MindSpore快速入门-张量

张量 Tensor 张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。 张量是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。张量&#x…

《C语言》编译和链接

文章目录 一、翻译环境1、预处理2、编译3、汇编4、链接 二、运行环境 一、翻译环境 在使用编译器编写代码时&#xff0c;编写的代码是高级语言&#xff0c;机器无法直接识别和运行&#xff0c;在编译器内部会翻译成机器可执行的机器语言。 编译环境由编译和链接两大过程组成。 …