原生aosp系统Launacher桌面默认会显示一个谷歌的搜索栏。
因为谷歌服务国内不可用,大部分国内定制桌面首先都要移除这个搜索栏。
下面我们来看看如何移除这个搜索栏。
首先,要知道这个搜索栏在布局中的位置以及具体的实现类。
将设备连接到pc上后,通过Android Studio的Layout Inspector查看布局,找到这个搜索栏,如下图所示:

搜索栏是自定义View,QsbContainerView,最终是被添加到Workspace中的。
搜索栏所在的布局文件为search_container_workspace
这个最终是在Workspace中inflate的这个布局,我们找到这个方法bindAndInitFirstWorkspaceScreen方法。
这里,首先有个条件判断,不符合直接就return了,这里正常情况因为QSB_ON_FIRST_SCREEN是true,所以一定会走到后面去添加搜索栏的步骤。所以,在这里,可以通过改变这个Flag直接return。
或者在后面不添加布局,还有一种修改方法就是直接将布局里面的内容移除。
public void bindAndInitFirstWorkspaceScreen() {
if ((!FeatureFlags.QSB_ON_FIRST_SCREEN
|| !mLauncher.getIsFirstPagePinnedItemEnabled())
|| shouldShowFirstPageWidget()) {
mFirstPagePinnedItem = null;
return;
}
// Add the first page
CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount());
if (mFirstPagePinnedItem == null) {
// In transposed layout, we add the first page pinned widget in the Grid.
// As workspace does not touch the edges, we do not need a full
// width first page pinned item.
// 搜索栏布局
mFirstPagePinnedItem = LayoutInflater.from(getContext())
.inflate(R.layout.search_container_workspace, firstPage, false);
}
int cellHSpan = mLauncher.getDeviceProfile().inv.numSearchContainerColumns;
CellLayoutLayoutParams lp = new CellLayoutLayoutParams(0, 0, cellHSpan, 1);
lp.canReorder = false;
if (!firstPage.addViewToCellLayout(
mFirstPagePinnedItem, 0, R.id.search_container_workspace, lp, true)) {
Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");
mFirstPagePinnedItem = null;
}
}
综合上面的信息,我们有三种移除搜索栏的方法。
- 修改布局文件
- 修改Workspace的添加代码
- 修改标志位FeatureFlag
好的,移除 Workspace 顶部的搜索栏 (QsbContainerView 或其容器 search_container_workspace) 是一个常见的定制需求。在 Launcher3 中,这个搜索栏通常不是直接写在主布局 launcher.xml 里的,而是作为一个特殊的“固定项”(Pinned Item) 动态添加到 Workspace 的第一个屏幕(Screen 0)。
以下是几种移除它的方法,按推荐程度排序:
使用功能标志 (FeatureFlags) (推荐)
这是最推荐且最符合 Launcher3 设计的方式。Launcher3 使用 FeatureFlags 来控制各种可选功能。
-
查找相关标志:
FeatureFlags.QSB_ON_FIRST_SCREEN: 这个标志看起来最直接相关。它的作用就是控制是否在 Workspace 的第一个屏幕上显示 QSB。FeatureFlags.ENABLE_SMARTSPACE_REMOVAL: 这个标志可能更广泛,但也可能影响 QSB 的显示,因为它似乎与移除第一屏的智能空间(Smartspace,通常包含 QSB 或 At a Glance)有关。
-
修改方法:
- 找到定义这些标志的文件。通常在类似
featureflags/src/com/android/launcher3/config/FeatureFlags.java或类似路径下。 - 找到
QSB_ON_FIRST_SCREEN的定义,通常是一个BooleanFlag。将其默认值修改为false。例如:// 修改前: // public static final BooleanFlag QSB_ON_FIRST_SCREEN = new BooleanFlag("QSB_ON_FIRST_SCREEN", true); // 修改后: public static final BooleanFlag QSB_ON_FIRST_SCREEN = new BooleanFlag("QSB_ON_FIRST_SCREEN", false); - 如果
QSB_ON_FIRST_SCREEN不起作用或你想采用更彻底的方式(可能移除 Smartspace 相关逻辑),可以研究ENABLE_SMARTSPACE_REMOVAL并将其默认值设为true。但请注意这可能会有更广泛的影响。 - 重新编译 Launcher3。
- 找到定义这些标志的文件。通常在类似
-
优点: 这是最干净、侵入性最小的方法,符合官方的配置方式,便于后续升级和维护。
-
代码依据: 在
Workspace.java的bindAndInitFirstWorkspaceScreen()方法中,有明确的逻辑检查FeatureFlags.QSB_ON_FIRST_SCREEN和shouldShowFirstPageWidget()(可能受ENABLE_SMARTSPACE_REMOVAL影响)。如果这些条件不允许显示 QSB,则mFirstPagePinnedItem会被设为null,或者bindAndInitFirstWorkspaceScreen可能根本不被调用。
修改布局文件 (Layout Modification)
你可以通过修改或覆盖(使用资源叠加层 Resource Overlay)相关的布局文件来移除搜索栏。
-
查找相关布局:
- 根据
Workspace.java中的bindAndInitFirstWorkspaceScreen()代码,它会加载R.layout.search_container_workspace这个布局。
- 根据
-
修改方法:
- 找到
res/layout/search_container_workspace.xml文件。 - 方法一 (清空): 将其内容清空,只保留一个空的根布局(例如
FrameLayout),或者设置根布局的android:visibility="gone"。 - 方法二 (覆盖): 在你的定制项目的
res/layout目录下创建一个同名文件search_container_workspace.xml,并提供一个空的或隐藏的布局作为覆盖。这是更推荐的修改布局的方式。 - 重新编译 Launcher3。
- 找到
-
优点: 比较直观,直接移除了视图。
-
缺点: 不如 FeatureFlags 灵活,如果 Launcher3 未来改变了加载 QSB 的方式或布局文件名,可能需要重新修改。
修改 Java 代码 (Code Modification - 不推荐)
直接修改 Workspace.java 的代码来阻止添加搜索栏。
-
修改方法:
- 找到
Workspace.java中的bindAndInitFirstWorkspaceScreen()方法。 - 直接注释掉或删除添加
mFirstPagePinnedItem到firstPage的代码块。 - 或者找到调用
bindAndInitFirstWorkspaceScreen()的地方(例如在setupViews()中),根据你的需要条件性地阻止调用它(例如总是阻止)。 - 重新编译 Launcher3。
- 找到
-
优点: 绝对有效。
-
缺点: 这是侵入性最强的方式,会增加后续合并官方 Launcher3 更新的难度和工作量,通常不推荐这样做。
总结:
首选方法是使用 FeatureFlags.QSB_ON_FIRST_SCREEN = new BooleanFlag("QSB_ON_FIRST_SCREEN", false);。这是最标准、最不容易产生副作用且最易于维护的方式。如果这个标志不起作用,再考虑检查 ENABLE_SMARTSPACE_REMOVAL 或使用布局覆盖的方法。应尽量避免直接修改核心 Java 代码。
最终修改效果如下:


4342

被折叠的 条评论
为什么被折叠?



