如何删除或更改SearchView actionBar内的搜索图标?

6

screenshot

如何移除或更改EditText内的搜索视图图标?我正在使用Appcompat库。

我试过以下代码去修改和移除,但是它没有生效:

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    View search_mag_icon = (View)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
        search_mag_icon.setBackgroundResource(R.drawable.ic_stub);
        //search_mag_icon.setVisibility(View.GONE);
9个回答

24

最终找到了解决办法。请尝试以下方法:

try {
    Field mDrawable = SearchView.class.getDeclaredField("mSearchHintIcon");
    mDrawable.setAccessible(true);
    Drawable drawable =  (Drawable)mDrawable.get(your search view here);
    drawable.setAlpha(0);
} catch (Exception e) {
    e.printStackTrace();
}

1
在尝试了一切之后,这是唯一对我起作用的解决方案,谢谢。 - Chol
2
添加这行代码 drawable.setBounds(0,0,0,0) 可以使您在图标之前显示带有 0 左填充的提示,否则提示将在图标后面显示,而图标仍然透明存在。 - SpiralDev
1
它能够工作但是显示一个警告:“检测到对字段'mSearchHintIcon'的反射访问以及不存在或不可见的方法”。 - Aashish Kumar

4

根据AppCompat v21博客文章,您可以为您的SearchView提供自定义样式,覆盖搜索图标等内容:

<style name="Theme.MyTheme" parent="Theme.AppCompat">
    <item name="searchViewStyle">@style/MySearchViewStyle</item>
</style>
<style name="MySearchViewStyle" parent="Widget.AppCompat.SearchView">
    <!-- Search button icon -->
    <item name="searchIcon">@drawable/custom_search_icon</item>
</style>

他想要完全从提示中删除这个图标,而不是替换它。 - Solace
1
@Solace - 将其替换为无 == 删除它 - ianhanniballake
我尝试了<item name="searchIcon"></item>,但是出现了String types not allowed (at 'searchIcon' with value '')的错误。如果您能指导一下我该怎么做,我将不胜感激。您自己尝试过这个吗? - Solace
1
@Solace - 你必须使用 @null,而不仅仅是空白。 - ianhanniballake
对我没用=( 实际上,这些样式都没有被应用,我在这里发布了一个问题(http://stackoverflow.com/questions/31889725/why-dont-appcompat-v21-searchview-styles-dont-apply-in-my-app) - Solace
这是这个帖子中唯一一个截至今天实际起作用的答案....谢谢!! - Isaac Urbina

2

不要使用私有方法作为SearchView.class.getDeclaredField("mSearchHintIcon");,这不是一个好主意。

<item android:id="@+id/menu_search"
        android:icon="@drawable/action_search"
        app:actionLayout="@layout/xx_layout"
        app:showAsAction="always"/>

在 xx_layout 中:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.SearchView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/search_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:searchHintIcon="@null"
    android:iconifiedByDefault="true" />

在样式上,<item name="searchIcon">@null</item> 和 <item name="searchHintIcon">@null</item> 就可以解决问题。 - Luis

1
您可以使用以下代码行:

int searchMagIcon = getResources().getIdentifier("search_mag_icon", "id", "android");
ImageView SearchHintIcon = (ImageView) searchView.findViewById(searchMagIcon);

这将保存ImageView,然后您可以更改它。


1

我使用具有属性app:actionViewClass="android.support.v7.widget.SearchView"的菜单项

在活动中,我设置了:

searchView = (SearchView) searchMenuItem.getActionView();
searchView.setIconifiedByDefault(false);

要删除图标,我做了以下操作:

ImageView searchIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
searchIcon.setImageDrawable(null);

0

最简单的方法是

  1. 如果您正在使用 AppCompat,请使用以下代码:

        app:iconifiedByDefault="false"
        app:searchIcon="@null"
    
  2. 否则,请将上述代码中的 app 替换为 android

    android:iconifiedByDefault="false"
    android:searchIcon="@null"
    

0

remove是你在xml中提到的正确的drawable:

final Drawable remove = ContextCompat.getDrawable(getActivity(), R.drawable.ic_close_circle);
        etSearchProducts.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                if (etSearchProducts.getCompoundDrawables()[2] == null) {
                    return false;
                }
                if (event.getAction() != MotionEvent.ACTION_UP) {
                    return false;
                }
                if (event.getX() > etSearchProducts.getWidth() - etSearchProducts.getPaddingRight() - remove.getIntrinsicWidth()) {
                    etSearchProducts.setText("");
                    Utility.hideKeyboard(getActivity());
                }

                return false;
            }
        });

0

只需在您的Searchview中将searchHintIcon属性设置为null即可。

app:searchHintIcon="@null"


0

我花了很多时间研究这个问题,最终找到了这个解决方案,它对我管用!
你可以使用这个。

如果你使用appcompat,请尝试这个:

ImageView searchIconView = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
searchIconView.setImageResource(R.drawable.yourIcon);

如果您使用androidx,请尝试以下操作:
ImageView searchIconView = (ImageView) searchView.findViewById(androidx.appcompat.R.id.search_button);
    searchIconView.setImageResource(R.drawable.yourIcon);

这将会改变默认的搜索视图图标。

希望能对您有所帮助!


只是想让你知道,将多个相同的答案发布到不同的问题中将自动标记为需要审核。如果你遇到了两个问题可以用同一个答案回答,那么你应该考虑将其中一个标记为另一个的重复。 - David Buck

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