Launcher3 去掉桌面搜索索框

文章目录

  • 需求
    • 实现需求说明
  • 参考资料
  • 修改文件
  • 实现思路
    • 首页显示的搜索框去除
    • 应用列表中的搜索框去除
    • 解决方案
    • 代码跟踪
    • 代码扩展


需求

Launcher3 去掉搜桌面索框

实现需求说明

  • 每个平台平台源码有区别,比如:MTK、高通、展讯、RK、谷歌…
  • 单个平台下 不同Android版本对应的模块源码也不一样

当前针对的是MTK Android12 来实现去掉搜索框功能,其它平台可借鉴部分实现思路。网上部分资料也因为不同平台不同版本,可能只能解决部分问题。实际还是需要自己针对性看源码,分析源码实现。

搜索框 有两部分: 主界面和所有应用的谷歌搜索框

参考资料

为了方便了解Launcher3,建议还是熟悉下相关Launcher3 知识点
菜鸟成长之路-源码分析专栏
Android Launcher3 简介
Launcher3 高端定制
Launcher3 开发
Launcher3 Android Code Search在线源码查看
Launcher3 xref 在线源码查看
Launcher3 RK 源码查看
Launcher3 解析
Launcher3 AndroidP AS版本
谷歌Launcher3 Android13源码修改
Launcher3 和 Launcher3QuickStep 区别
Android14 不分Launcher3修改
Launcher3 LoaderTask 的数据加载
Android14 浅析Launcher
Android O Launcher3-Workspace加载

修改文件

packages/apps/Launcher3/res/layout/search_container_workspace.xml
packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
packages/apps/Launcher3/res/layout/secondary_launcher.xml

实现思路

首页显示的搜索框去除

去除首页的搜索框思路方法基本一致,search_container_workspace.xml 修改:屏蔽Fragment 配置

<com.android.launcher3.qsb.QsbContainerViewxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="0dp"android:id="@id/search_container_workspace"android:padding="0dp" ><!-- 
注释这一段<fragmentandroid:name="com.android.launcher3.qsb.QsbContainerView$QsbFragment"android:layout_width="match_parent"android:tag="qsb_view"android:layout_height="match_parent"/>-->
</com.android.launcher3.qsb.QsbContainerView>

Workspace.java 文件修改

bindAndInitFirstWorkspaceScreen  方法中,屏蔽// Add the first pageCellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount());// Always add a QSB on the first screen.if (mQsb == null) {// In transposed layout, we add the QSB in the Grid. As workspace does not touch the// edges, we do not need a full width QSB.mQsb = LayoutInflater.from(getContext()).inflate(R.layout.search_container_workspace, firstPage, false);}int cellVSpan = FeatureFlags.EXPANDED_SMARTSPACE.get()? EXPANDED_SMARTSPACE_HEIGHT : DEFAULT_SMARTSPACE_HEIGHT;CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, twoQsb?1:0, firstPage.getCountX(),cellVSpan);lp.canReorder = false;if (!firstPage.addViewToCellLayout(mQsb, 0, R.id.search_container_workspace, lp, true)) {Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");mQsb = null;}

应用列表中的搜索框去除

实际这个需求实现, 在不同的平台和版本区别很大,借鉴解决思路。

解决方案

解决方案:找到对应表的布局,将布局中的View
com.android.launcher3.allapps.search.AppsSearchContainerLayout 设置为GONE 状态

代码跟踪

首先看Launcher 目录有一个allapps: 自己猜是所有app 的意思吧
在这里插入图片描述
看着像的就去看一下源码 ![(https://i-blog.csdnimg.cn/direct/6e65499862dc4d60a68dc2f1d2878f46.png)

在这里插入图片描述

在AllAppsContainerView.java 文件中有这样一段代码,初始化View


这个search 相关的 search_container_all_apps,看着像mSearchContainer = findViewById(R.id.search_container_all_apps);mSearchUiManager = (SearchUiManager) mSearchContainer;mSearchUiManager.initializeSearch(this);mSearchContainer.setVisibility(View.GONE);

那就找 search_container_all_apps ,grep -rn search_container_all_apps 一次

fise4@ubuntu-PowerEdge-R730:~/Android/mt6769-alps-release-s0.mp1.rc/alps-release-s0.mp1.rc$ grep -rn "search_container_all_apps"
packages/apps/Launcher3/res/values/config.xml:108:    <item type="id" name="search_container_all_apps" />
packages/apps/Launcher3/res/layout/all_apps_tabs.xml:23:    android:layout_below="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/secondary_launcher.xml:65:            android:layout_below="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/secondary_launcher.xml:102:            android:id="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/all_apps_content_layout.xml:21:    android:layout_below="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/all_apps_rv_layout.xml:22:    android:layout_below="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/all_apps_fast_scroller.xml:24:        android:layout_below="@+id/search_container_all_apps"
packages/apps/Launcher3/res/layout/all_apps_fast_scroller.xml:33:        android:layout_below="@+id/search_container_all_apps"
packages/apps/Launcher3/res/layout/search_container_all_apps.xml:18:    android:id="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/all_apps.xml:36:        android:layout_below="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/all_apps.xml:48:        layout="@layout/search_container_all_apps"/>
packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java:378:        mSearchContainer = findViewById(R.id.search_container_all_apps);
packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java:382:		Log.d(TAG," findViewById search_container_all_apps     GONE");
packages/apps/Launcher3/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java:51:                    allAppsContainer, "search_container_all_apps");
packages/apps/Launcher3/tests/tapl/com/android/launcher3/tapl/AllApps.java:203:        return mLauncher.waitForObjectInContainer(allAppsContainer, "search_container_all_apps");

整理出有用的信息如下

packages/apps/Launcher3/res/values/config.xml:108:    <item type="id" name="search_container_all_apps" />
packages/apps/Launcher3/res/layout/secondary_launcher.xml:102:            android:id="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/search_container_all_apps.xml:18:    android:id="@id/search_container_all_apps"
packages/apps/Launcher3/res/layout/all_apps.xml:48:        layout="@layout/search_container_all_apps"/>

再次搜索对应的文件

  • secondary_launcher.xml 找到 SecondaryDisplayLauncher.java 对应
  • search_container_all_apps.xml -> 无
  • all_apps.xml -> 无

我们看看secondary_launcher.xml 发现有一个搜索的View, AppsSearchContainerLayout 设置为GONE 状态,就是 search_container_all_apps 对应的View

<?xml version="1.0" encoding="utf-8"?>
<com.android.launcher3.secondarydisplay.SecondaryDragLayerxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/drag_layer"android:padding="@dimen/dynamic_grid_edge_margin"><GridViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginBottom="100dp"android:theme="@style/HomeScreenElementTheme"android:layout_gravity="center_horizontal|top"android:layout_margin="@dimen/dynamic_grid_edge_margin"android:id="@+id/workspace_grid" /><ImageButtonandroid:id="@+id/all_apps_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:layout_margin="40dp"android:padding="16dp"android:src="@drawable/ic_apps"android:background="@drawable/bg_all_apps_button"android:contentDescription="@string/all_apps_button_label"android:onClick="onAppsButtonClicked" /><com.android.launcher3.allapps.AllAppsContainerViewandroid:id="@+id/apps_view"android:layout_width="match_parent"android:layout_height="match_parent"android:clipChildren="true"android:clipToPadding="false"android:focusable="false"android:saveEnabled="false"android:layout_gravity="bottom|end"android:background="@drawable/round_rect_primary"android:elevation="2dp"android:visibility="invisible" ><includelayout="@layout/all_apps_rv_layout"android:visibility="gone" /><com.android.launcher3.allapps.FloatingHeaderViewandroid:id="@+id/all_apps_header"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/search_container_all_apps"android:clipToPadding="false"android:paddingTop="@dimen/all_apps_header_top_padding"android:orientation="vertical" ><com.android.launcher3.workprofile.PersonalWorkSlidingTabStripandroid:id="@+id/tabs"android:layout_width="match_parent"android:layout_height="@dimen/all_apps_header_pill_height"android:orientation="horizontal"style="@style/TextHeadline"><Buttonandroid:id="@+id/tab_personal"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="?android:attr/selectableItemBackground"android:text="@string/all_apps_personal_tab"android:textAllCaps="true"android:textColor="@color/all_apps_tab_text"android:textSize="14sp" /><Buttonandroid:id="@+id/tab_work"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="?android:attr/selectableItemBackground"android:text="@string/all_apps_work_tab"android:textAllCaps="true"android:textColor="@color/all_apps_tab_text"android:textSize="14sp" /></com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip></com.android.launcher3.allapps.FloatingHeaderView><com.android.launcher3.allapps.search.AppsSearchContainerLayoutandroid:id="@id/search_container_all_apps"android:layout_width="match_parent"android:layout_height="@dimen/all_apps_search_bar_field_height"android:layout_centerHorizontal="true"android:layout_gravity="top|center_horizontal"android:background="@drawable/bg_all_apps_searchbox"android:elevation="1dp"android:focusableInTouchMode="true"android:gravity="center"android:hint="@string/all_apps_search_bar_hint"android:imeOptions="actionSearch|flagNoExtractUi"android:inputType="text|textNoSuggestions|textCapWords"android:maxLines="1"android:padding="8dp"android:saveEnabled="false"android:scrollHorizontally="true"android:singleLine="true"android:textColor="?android:attr/textColorSecondary"android:textColorHint="@drawable/all_apps_search_hint"android:textSize="16sp"android:visibility="gone"/><include layout="@layout/all_apps_fast_scroller" /></com.android.launcher3.allapps.AllAppsContainerView>
</com.android.launcher3.secondarydisplay.SecondaryDragLayer>

代码扩展

上面的更改已经实现了需求,我们接着看 secondary_launcher.xml 对应的Java 文件

AllAppsContainerView.java    onFinishInflate() 方法@Overrideprotected void onFinishInflate() {super.onFinishInflate();Log.d(TAG,"onFinishInflate");// This is a focus listener that proxies focus from a view into the list view.  This is to// work around the search box from getting first focus and showing the cursor.setOnFocusChangeListener((v, hasFocus) -> {if (hasFocus && getActiveRecyclerView() != null) {getActiveRecyclerView().requestFocus();}});mHeader = findViewById(R.id.all_apps_header);rebindAdapters(mUsingTabs, true /* force */);mSearchContainer = findViewById(R.id.search_container_all_apps);   //搜索框,找的就是这个搜索框mSearchUiManager = (SearchUiManager) mSearchContainer;mSearchUiManager.initializeSearch(this);//下面代码自己添加的mSearchContainer.setVisibility(View.GONE);Log.d(TAG," findViewById search_container_all_apps     GONE");}

实际验证在不修改布局情况下,这里设置GONE 没有用

跟踪:mSearchContainer, 对外提供的方法public View getSearchView() {return mSearchContainer;}搜索 getSearchView() 方法fise4@ubuntu-PowerEdge-R730:~/Android/mt6769-alps-release-s0.mp1.rc/alps-release-s0.mp1.rc/packages/apps/Launcher3$ grep -rn getSearchView
src/com/android/launcher3/allapps/AllAppsContainerView.java:586:    public View getSearchView() {
src/com/android/launcher3/allapps/AllAppsContainerView.java:806:                (int) (getSearchView().getAlpha() * 255));
src/com/android/launcher3/allapps/AllAppsContainerView.java:809:            getSearchView().setBackgroundColor(viewBG);
src/com/android/launcher3/allapps/AllAppsContainerView.java:816:		getSearchView().setVisibility(View.GONE);这些都是 AllAppsContainerView.java  里面获取View; 回头看 secondary_launcher.xml 对应的类是SecondaryDisplayLauncher.java 找到 SecondaryDisplayLauncher.java showAppDrawer 方法,在这个方法里去通过getSearchView 获取到搜索框,然后对搜索框设置GONE 不显示也可以的。/*** Show/hide app drawer card with animation.*/public void showAppDrawer(boolean show) {Log.d(TAG," showAppDrawer   show");if (show == mAppDrawerShown) {return;}float openR = (float) Math.hypot(mAppsView.getWidth(), mAppsView.getHeight());float closeR = Themes.getDialogCornerRadius(this);float startR = mAppsButton.getWidth() / 2f;float[] buttonPos = new float[] { startR, startR};mDragLayer.getDescendantCoordRelativeToSelf(mAppsButton, buttonPos);mDragLayer.mapCoordInSelfToDescendant(mAppsView, buttonPos);final Animator animator = ViewAnimationUtils.createCircularReveal(mAppsView,(int) buttonPos[0], (int) buttonPos[1],show ? closeR : openR, show ? openR : closeR);if (show) {mAppDrawerShown = true;mAppsView.setVisibility(View.VISIBLE);mAppsButton.setVisibility(View.INVISIBLE);} else {mAppDrawerShown = false;animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {mAppsView.setVisibility(View.INVISIBLE);mAppsButton.setVisibility(View.VISIBLE);mAppsView.getSearchUiManager().resetSearch();}});}Log.d(TAG," showAppDrawer  set searchView Gone");//设置为 GONE mAppsView.getSearchView().setVisibility(View.GONE);animator.start();}

showAppDrawer 方法,只是在特定的情况下执行,所以在这个方法里面执行设置GONE逻辑并不是完全之策,最简单直接就是更改布局GONE 状态了。

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

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

相关文章

红队-shodan搜索引擎篇

如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.shodan原理与功能的介绍 Shodan Search Engine 它是专门搜网络设备的,只要联网的,只要有IP地址的都可以称为网络设备 1.shodan&#x…

初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势&#xff1a;生产者—消费者模型的劣势&#xff1a; Java标准库中的阻…

基于Multisim汽车尾灯电路左转右转刹车检查功能电路(含仿真和报告)

【全套资料.zip】汽车尾灯电路左转右转刹车检查功能电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 电路有按键控制&#xff0c;分别对应左转&#xff0c;右转&#xff0c;刹车&a…

实现GUI界面中的logo图片的编码与隐藏

实现GUI界面中的logo图片的编码与隐藏 一、问题描述二、解决办法 一、问题描述 利用PyQt5编写的GUI界面&#xff0c;有时候需要我们添加自定义的图片来作为UI界面的logo&#xff0c;在源码使用时&#xff0c;logo的形式一般不影响使用&#xff0c;但是当我们需要将软件进行打包…

LabVIEW离心泵性能优化测试系统

开发了一套基于LabVIEW平台开发的离心泵性能优化测试系统。系统集成了数据采集、流量控制、数据存储、报表生成等功能&#xff0c;提供了低成本、便捷操作的解决方案&#xff0c;适用于工业场景中对离心泵性能的精确测评。 项目背景 随着工业化进程的加速&#xff0c;离心泵在…

论文阅读(三十二):EGNet: Edge Guidance Network for Salient Object Detection

文章目录 1.Introduction2.Related Works3.Salient Edge Guidance Network3.1Complementary information modeling3.1.1Progressive salient object features extraction3.1.2Non-local salient edge features extraction 3.2One-to-one guidance module 4.Experiments4.1Imple…

三大细分领域入选,九州未来再登2024边缘计算产业图谱

10月31日&#xff0c;经过数月的深入调研和专家严格评估&#xff0c;边缘计算社区正式发布《2024边缘计算产业图谱》。该图谱全面收录中国边缘计算领域最具活力的100家企业、科研机构、高校及标准组织等单位&#xff0c;深入梳理产业链上下游发展情况&#xff0c;精准研判边缘计…

【HarmonyOS】鸿蒙系统

文章目录 前言一、鸿蒙OS概述1. 定义与特性2. 核心技术理念3. 技术架构设计1. 应用层2. 框架层3. 系统服务层4. 内核层 二、分布式架构分布式架构的核心理念分布式能力的实现关键技术 三、 总结 前言 鸿蒙OS是由华为推出的一款开源操作系统&#xff0c;旨在满足智能终端设备的…

强网杯 2024 pwn false AK

强网杯 2024 pwn &#x1f3c4;&#x1f3fd;‍♀️前言&#x1f3c4;&#x1f3fd;‍♂️heap&#xff08;UAF house of banana orw&#xff09;&#x1f3c4;&#x1f3fd;分析&#x1f3c4;&#x1f3fd;解题&#x1f3c4;&#x1f3fd;exp &#x1f3c4;&#x1f3fd;‍♂…

w016基于Springboot的房产销售系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python毕业设计选题:基于大数据的旅游景区推荐系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页界面 用户注册界面 用户登录界面 景点信息界面 景点资讯界面 个人中心界面 …

【c++篇】:掌握vector基础知识--基本操作与使用全知道

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨个人主页&#xff1a;余辉zmh–CSDN博客 ✨文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.vector的基本概念1.定义2.主要特性和优点 二.vector的基本操作…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

机器学习周报(RNN的梯度消失和LSTM缓解梯度消失公式推导)

文章目录 摘要Abstract 1 RNN的梯度消失问题2 LSTM缓解梯度消失总结 摘要 在深度学习领域&#xff0c;循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;被广泛应用于处理序列数据&#xff0c;特别是在自然语言处理、时间序列预测等任务中。然而&#xff0c…

Mastercam2025软件安装教程+MC2025中文安装包下载

一、软件下载 【软件名称】&#xff1a;MasterCAM 2025 【支持系统】&#xff1a;win10/win11 【百度网盘】&#xff1a;https://pan.baidu.com/s/12fY66cwRLGcKdeVoJ40ZRw?pwd70zi 二、Mastercam软件 Mastercam是美国 CNC Software 公司开发的一款 CAD/CAM 软件。它集二维…

[vulnhub] DC: 8

https://www.vulnhub.com/entry/dc-8,367/ 描述&#xff1a;在 Linux 上安装和配置双因素身份验证是否可以防止 Linux 服务器被利用 端口扫描主机发现 探测存活主机&#xff0c;179是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.or…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中&#xff0c;自扶正救生艇能够发挥关键的救援和保障作用&#xff0c;确保救援人员和被困人员的生命安全&#xff0c;尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船&#xff0c;救生艇能够迅速恢复正常姿态&#xff0c;确保救援人员不会…

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

QT——自定义控件绘图

一.QPaintEvent绘图事件 QPaintEvent是QT中一个重要的类&#xff0c;专门用于绘图事件。当QT视图组件需要重绘制自己的一部分时&#xff0c;就会产生该事件&#xff0c;通常发生在以下几种情况。 窗口第一次显示时&#xff1a;当窗口或控件第一次出现在屏幕中&#xff0c;系统…

【Python · Pytorch】人工神经网络 ANN(上)

【Python Pytorch】人工神经网络 ANN&#xff08;上&#xff09; 0. 生物神经网络1. 人工神经网络定义2. 人工神经网络结构2.1 感知机2.2 多层感知机2.3 全连接神经网络2.4 深度神经网络 2. 训练流程※ 数据预处理 (Data Preprocessing) 3. 常见激活函数3.1 Sigmoid / Logisti…