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.rhkb.cn/news/463282.html

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

相关文章

qt QDoubleSpinBox详解

1、概述 QDoubleSpinBox是Qt框架中的一个控件&#xff0c;专门用于浮点数&#xff08;即小数&#xff09;的输入和调节。它提供了一个用户界面元素&#xff0c;允许用户在预设的范围内通过拖动滑块、点击箭头或使用键盘来递增或递减浮点数值。QDoubleSpinBox通常用于需要精确数…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理视频监控新选择

在数字化转型的浪潮中&#xff0c;视频监控作为安防领域的核心组成部分&#xff0c;正经历着前所未有的技术革新。随着技术的不断进步和应用场景的不断拓展&#xff0c;视频监控系统的兼容性、稳定性以及安全性成为了用户关注的焦点。NVR小程序接入平台/设备EasyNVR&#xff0c…

qt QAction详解

1、概述 QAction是Qt框架中的一个抽象类&#xff0c;用于表示用户界面中的一个动作&#xff08;action&#xff09;。这些动作可以绑定到菜单项、工具栏按钮或快捷键上&#xff0c;提供了一种灵活的方式来处理用户交互。QAction不仅包含了动作的名称、图标、提示信息等属性&am…

【快速上手】pyspark 集群环境下的搭建(Standalone模式)

目录 前言 &#xff1a; 一、spark运行的五种模式 二、 安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 三、集群启动/关闭 四、打开监控界面验证 前…

python如何调字体大小

1、打开电脑上的IDLE程序。 2、默认字体大小给出一个直观的展示。小编自认为还是比较小的&#xff0c;觉得调整大一点比较好。 3、点击菜单栏的【Options】。 4、然后点击【Configure IDLE】。 5、默认字体是新宋体&#xff0c;大小是size4。 6、根据自己需要设置字体大小后&am…

创造、竞争、征服:成为 The Sandbox 的创作者

Alpha 第 4 季将改变创作者在 The Sandbox 中实现激情的方式&#xff01;本季有 40% 的体验由我们的社区打造&#xff0c;The Sandbox 是你打造难忘冒险的平台&#xff0c;并在元宇宙中激励他人。无论你的梦想是制作惊险刺激的任务&#xff0c;还是设计自己生机勃勃的风景&…

Nico,从零开始干掉Appium,移动端自动化测试框架实现

开头先让我碎碎念一波~去年差不多时间发布了一篇《 UiAutomator Nico&#xff0c;一个基于纯 adb 命令实现的安卓自动化测试框》&#xff08;https://testerhome.com/topics/37042&#xff09;&#xff0c; 由于种种原因 (详见此篇帖子) 当时选择了用纯 adb 命令来实现安卓自动…

Vue项目开发:Vuex使用,表单验证配置,ESLint关闭与常见问题解决方案

文章目录 vuexvue配置form表单验证移除vue中表单验证的两种方法关闭vue项目的eslint代码校验做vue项目出现的问题 vuex Vue提供的状态管理工具&#xff0c;用于统一管理我们项目中各种数据的交互和重用&#xff0c;存储我们需要用到的数据对象属性 state&#xff1a;vuex的基本…

波尼音乐 2.3.0-b1 | 开源免费的音乐播放器,附两个公共接口

波尼音乐最初作为一个毕设项目&#xff0c;凭借其实现了本地与网络音乐播放的能力而受到许多用户的喜爱。随着百度在线音乐API的关闭&#xff0c;波尼音乐逐渐失去在线音乐播放功能。在开源社区的支持下&#xff0c;开发者发现新的网易云音乐API&#xff0c;重启项目并进行全面…

“死鱼眼”,不存在的,一个提词小技巧,拯救的眼神——将内容说给用户,而非读给用户!

视频录制时&#xff0c;死鱼眼问题常见 即便内容再好&#xff0c;眼神死板也会减分 痛点真痛&#xff1a;拍视频时容易紧张 面对镜头&#xff0c;许多人难免紧张 神情僵硬&#xff0c;眼神无光&#xff0c;甚至忘词 这不仅影响表现&#xff0c;还让人难以专注 忘我场景&#x…

Java | Leetcode Java题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution {public int findMaxLength(int[] nums) {int maxLength 0;Map<Integer, Integer> map new HashMap<Integer, Integer>();int counter 0;map.put(counter, -1);int n nums.length;for (int i 0; i < n;…

C语言 | Leetcode C语言题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; int countArrangement(int n) {int f[1 << n];memset(f, 0, sizeof(f));f[0] 1;for (int mask 1; mask < (1 << n); mask) {int num __builtin_popcount(mask);for (int i 0; i < n; i) {if (mask & (1 <<…

HarmonyOS第一课 06 构建更加丰富的页面-习题解析

判断题 1. Tabs组件可以通过接口传入一个TabsController&#xff0c;该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…

xilinx vitis 更换硬件平台——ZYNQ学习笔记5

1、重新生成硬件信息 2、选择带有bit信息 3、设施路径和名字 4、打开更新硬件选项 5、选择新的硬件信息 6、打开系统工程界面 7、复位硬件信息 更新完毕

哪一款防脱生发的产品效果好?教科书式教你如何挑

头发护理越来越被重视&#xff0c;因为现在脱发秃头的人实在太多了&#xff0c;本人几年前就开始关注头发护理了&#xff0c;目前头发光泽垂顺浓密&#xff0c;好多次被夸发质好发量多。今天给大家推荐几款好用的防脱育发精华吧&#xff0c;好用有效无平替版。 第1款&#xff…

一键AI换衣-可图AI试衣

我们的真的实现了穿衣自由了吗&#xff1f;上传一张人物图片和衣服的图片&#xff0c;就能实现一键换衣。 这就是可图AI试衣项目 魔塔地址&#xff1a;https://www.modelscope.cn/studio ... lors-Virtual-Try-On 参考&#xff1a; 一键AI换衣-可图AI试衣 https://www.jinsh…

vue项目安装组件失败解决方法

1.vue项目 npm install 失败 删除node_modules文件夹、package-lock.json 关掉安装对话框 重新打开对话框 npm install

HTML 基础标签——链接标签 <a> 和 <iframe>

文章目录 1. `<a>` 标签属性详细说明示例2. `<iframe>` 标签属性详细说明示例注意事项总结链接标签在HTML中是实现网页导航的重要工具,允许用户从一个页面跳转到另一个页面或嵌入外部内容。主要的链接标签包括 <a> 标签和<iframe> 标签。本文将深入探…

GESP4级考试语法知识(冒泡排序)

冒泡排序参考程序&#xff1a; #include <iostream> using namespace std; const int MAXN10001; int main() {int n,i,j;float a[MAXN];cin>>n;for(i1;i<n;i)cin>>a[i]; //输入n个数bool ok;for(in;i>1;i--){oktrue; //判断是…

Flutter CustomScrollView 效果-顶栏透明与标签栏吸顶

CustomScrollView 效果 1. 关键组件 CustomScrollView, SliverOverlapAbsorber, SliverPersistentHeader 2. 关键内容 TLDR SliverOverlapAbsorber 包住 pinned为 true 的组件 可以被CustomScrollView 忽略高度。 以下的全部内容的都为了阐述上面这句话。初阶 Flutter 开发知…