如何删除或更改SearchView actionBar中的searchview图标?

时间:2015-04-14 17:38:47

标签: android android-actionbar android-appcompat searchview appcompat-v7-r21

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);

8 个答案:

答案 0 :(得分:17)

终于找到了解决方案。请尝试以下方法:

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 :(得分:4)

根据AppCompat v21 blog post,您可以为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>

答案 2 :(得分:1)

您可以使用以下代码行:

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

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

答案 3 :(得分: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);

答案 4 :(得分:1)

最好不要将私有方法用作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" />

答案 5 :(得分: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;
            }
        });

答案 6 :(得分:0)

最简单的方法是

  1. 如果您使用的是AppCompat

        app:iconifiedByDefault="false"
        app:searchIcon="@null"
    
  2. 在上面的代码中使用android代替app

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

答案 7 :(得分: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);

它将更改默认的serchview图标。

希望有帮助!