如何在Android工具栏中的SearchView小部件中去除白色下划线

92

我在我的项目中使用了工具栏搜索小部件。一切都很好,但是我完全卡在如何删除工具栏搜索字段下面的下划线上。我尝试了许多解决方案,但都没有成功。以下是我尝试过的一些解决方案。

要求是删除图像中的白色下划线

输入图像描述

第一个解决方案:

//Removing underline

    int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
    View searchPlate = searchView.findViewById(searchPlateId);
    if (searchPlate!=null) {
        searchPlate.setBackgroundColor (Color.TRANSPARENT);
        int searchTextId = searchPlate.getContext ().getResources ().getIdentifier ("android:id/search_src_text", null, null);

    }

第二种解法:

 EditText searchEdit = ((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text));
 searchEdit.setBackgroundColor(Color.TRANSPARENT);

上述代码可以改变EditText的背景颜色,但是在SearchBar中关闭图标下面仍然会显示下划线。

我使用的完整SearchBar小部件代码如下:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater infl) {
        super.onCreateOptionsMenu(menu, infl);
        MenuInflater inflater = getActivity().getMenuInflater();
        inflater.inflate(R.menu.action_search, menu);
        final SearchView searchView = (SearchView) MenuItemCompat
                .getActionView(menu.findItem(R.id.search));

        SearchManager searchManager = (SearchManager) getActivity ().getSystemService (getActivity ().SEARCH_SERVICE);
        searchView.setSearchableInfo (searchManager.getSearchableInfo (getActivity ().getComponentName ()));

        //changing edittext color
        EditText searchEdit = ((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text));
        searchEdit.setTextColor(Color.WHITE);
}

action_search.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:compat="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/search"
        android:title="Search"
        android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
        compat:showAsAction="ifRoom|collapseActionView"
        compat:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

可能是重复的问题,参考此处


1
尝试在XML文件中设置这两个属性:android:submitBackground="@android:color/transparent"和android:queryBackground="@android:color/transparent"。 - Abhishek
细线是否会自动渲染?我正在努力添加一条线! - user1841702
11个回答

169

如果您正在使用SearchView,则使用API 21以下的版本。

android:queryBackground="@android:color/transparent"

如果您使用的是API 21或更高版本,您可以使用以下代码

app:queryBackground="@android:color/transparent"

1
请注意,此属性仅适用于Api Level 21及以上版本。 - Chintan Soni
4
尝试使用以下代码:app:queryBackground="@android:color/transparent" =) (翻译说明:根据要求进行了翻译,并尽力使翻译通俗易懂,同时保持了原文的含义和语境,没有添加任何额外的解释或信息。) - Vlad Zbuker
1
app:queryBackground="@android:color/transparent" 在 API 级别 21 上能够正常工作,而 android:queryBackground="@android:color/transparent" 则不行。 - Nikhil
2
它在API 29上对我不起作用 :( 我仍然看到下划线。 - Hesam
2
说实话,决定的不是API级别,而是你使用的视图类型。例如,我在API 28中使用SearchView(而不是androidx.appcompat.widget.SearchView),那么我应该使用android:前缀。 - Samuel T. Chou

57

尝试以下方法

View v = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
v.setBackgroundColor(Color.parseColor("here give actionbar color code"));

希望这能对你有所帮助。


谢谢!这正是我在寻找的。 - Chandru
当SearchView有一个语音按钮时,你该怎么办?我尝试使用相同的技巧和search_voice_btn ID,但它不起作用。 - herau
2
非常感谢。在我的情况下,我将背景可绘制设置为null,即_searchView.findViewById(android.support.v7.appcompat.R.id.search_plate)setBackground(null)_。 - Vinay Vissh
2
不要帮我。下划线保持不变。 - Alex
以下答案应该被接受为正确答案,而不是这个。 - beyondtheteal
对于AndroidX,请使用:androidx.appcompat.R.id.search_plate - Bruno Bieri

57

如果您正在使用v7或androidx小部件,请添加此行。

app:queryBackground="@android:color/transparent"

6
如果'app:'无法运行,请尝试使用'android:'。这对我很有效。 - SHALIN PATEL

42

或者您可以通过样式来实现:

<style name="SearchViewMy" parent="Widget.AppCompat.Light.SearchView">
    <item name="submitBackground">@color/primaryColor</item>
    <item name="queryBackground">@color/primaryColor</item>
</style>

queryBackground是用于查询背景的属性。如果您支持语音搜索,您可能希望删除麦克风按钮下面的那行。这就是submitBackground属性的作用。

当然,还需要将样式应用到您的主题中。

<style name="Theme.App" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
    <item name="searchViewStyle">@style/SearchViewMy</item>
</style>

6
这是最佳答案,因为它不会对支持库的视图层次结构实现做出假设,而这可能会在没有通知的情况下发生变化。 - TheIT
1
确实是最佳答案!在尝试其他解决方案之前,请首选此答案。 - Shruti
不行。无法工作。 - chitgoks

12

对于AndroidX,我根据其他回答在这里使用了这个。

searchView.findViewById(androidx.appcompat.R.id.search_plate)
        .setBackgroundColor(Color.TRANSPARENT)

1
很棒的解决方案,谢谢 :) - iamkdblue

7
如果你想从SearchView中去掉下划线,那么只需将以下代码复制粘贴至你的SearchView。它可以生效。
 android:queryBackground="@null"

像这样,

      <SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:queryBackground="@null"
                />

6
您可以尝试使用以下代码,对我来说效果非常好。
View v = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
    v.setBackgroundColor(ContextCompat.getColor(context,android.R.color.transparent));

1
不要使用 ContextCompat.getColor...,而是直接使用 Color.TRANSPARENT - natronite

3
以下代码对我有效。
val searchView = menu?.findItem(R.id.action_search)?.actionView as SearchView
searchView.findViewById<View>(androidx.appcompat.R.id.search_plate).background = null

2
对于 androidxkotlin 技术相关内容如下:
        menuInflater.inflate(R.menu.conversation_list_screen_menu, menu)
        val searchItem = menu.findItem(R.id.action_search)
        searchView = searchItem.actionView as SearchView
        searchView?.findViewById<View>(androidx.appcompat.R.id.search_plate)?.setBackgroundColor(Color.TRANSPARENT)

0
下面是更改SearchView编辑文本背景色的代码
public static void setSearchViewEditTextBackgroundColor(Context context, SearchView searchView, int backgroundColor){
    int searchPlateId = context.getResources().getIdentifier("android:id/search_plate", null, null);
    ViewGroup viewGroup = (ViewGroup) searchView.findViewById(searchPlateId);
    viewGroup.setBackgroundColor(ComponentUtils.getColor(context, backgroundColor));
}

如果您的操作栏背景颜色为白色,则请按照以下方式调用上述方法。
setSearchViewEditTextBackgroundColor(this, searchView, R.color.white);

现在SearchView编辑文本的下划线将消失。


实际上,这是唯一对我有效的答案。关于为什么这个方法有效的详细解释可以在这里找到。 - Igor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接