如何更改SearchView上的默认图标,以便在Android的操作栏中使用?

Val*_*mar 53 android android-actionbar

我在SearchView中自定义搜索图标时遇到了一些麻烦.在我看来,可以在Item属性中更改图标,对吧?只需检查下面的代码..

有人能告诉我我做错了什么吗?

这是我正在使用的菜单,我的自定义搜索图标icn_lupa.但是当我运行应用程序时,我总是得到默认的搜索图标......

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_search"
      android:title="@string/menu_search"
      android:icon="@drawable/icn_lupa"
      android:showAsAction="always"
      android:actionViewClass="android.widget.SearchView" />
</menu>
Run Code Online (Sandbox Code Playgroud)

提前致谢.

jus*_*ser 88

我找到了另一种改变搜索图标的方法,该图标与Diego Pino的答案相同,但直接进入onPrepareOptionsMenu.

在您的menu.xml中(与之前相同)

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_search"
      android:icon="@drawable/ic_action_fav"
      android:title="@string/action_websearch"
      android:showAsAction="always|never"
      android:actionViewClass="android.widget.SearchView" />
</menu>
Run Code Online (Sandbox Code Playgroud)

在您的活动中:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem searchViewMenuItem = menu.findItem(R.id.action_search);    
    mSearchView = (SearchView) searchViewMenuItem.getActionView();
    int searchImgId = getResources().getIdentifier("android:id/search_button", null, null);
    ImageView v = (ImageView) mSearchView.findViewById(searchImgId);
    v.setImageResource(R.drawable.your_new_icon); 
    mSearchView.setOnQueryTextListener(this);
    return super.onPrepareOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

我按照示例更改了此示例中的edittext .

您应该可以为您的所有图标/背景执行此操作SearchView,以找到您可以在此处查看的正确ID .

希望这对其他人也有帮助!

2017年11月更新:

由于这个答案android已经更新,可以通过XML更改搜索图标.

如果你的目标是android v21以下,你可以使用:

<android.support.v7.widget.SearchView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    app:searchIcon="@drawable/ic_search_white_24dp"
    app:closeIcon="@drawable/ic_clear_white_24dp" />
Run Code Online (Sandbox Code Playgroud)

或者v21及更高版本:

<SearchView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:searchIcon="@drawable/ic_search_white_24dp"
    android:closeIcon="@drawable/ic_clear_white_24dp" />
Run Code Online (Sandbox Code Playgroud)

还有更多选择:

closeIcon
commitIcon
goIcon
searchHintIcon
searchIcon
voiceIcon
Run Code Online (Sandbox Code Playgroud)

  • 使用SpannableStringBuilder更新提示.复制以下来自android源码,SpannableStringBuilder ssb = new SpannableStringBuilder(""); //用于图标ssb.append(hintText); Drawable searchIcon = getResources().getDrawable(R.drawable.search_or); int textSize =(int)(searchTextView.getTextSize()*1.25); searchIcon.setBounds(0,0,textSize,textSize); ssb.setSpan(new ImageSpan(searchIcon),1,2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); searchTextView.setHint(SSB); (3认同)
  • 我不知道如何使用您的更新版本,也可以和我们分享您的`menu.xml`吗? (2认同)

pat*_*n91 36

@just_user的答案很好

对于我的情况,因为我正在使用appcompat v7库来搜索SearchView + ActionBar,我修改了他的解决方案以使其与我的项目兼容,它应该可以工作,只要你在添加appcompat v7时没有修改任何内容图书馆

XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:metrodeal="http://schemas.android.com/apk/res-auto" >


    <item
        android:id="@+id/main_menu_action_search"
        android:orderInCategory="100"
        android:title="@string/search"
        metrodeal:showAsAction="always"
        metrodeal:actionViewClass="android.support.v7.widget.SearchView" 
        android:icon="@drawable/search_btn"/>

</menu>
Run Code Online (Sandbox Code Playgroud)

Java代码:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem searchViewMenuItem = menu.findItem(R.id.main_menu_action_search);
    SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchViewMenuItem);
    int searchImgId = android.support.v7.appcompat.R.id.search_button; // I used the explicit layout ID of searchview's ImageView
    ImageView v = (ImageView) mSearchView.findViewById(searchImgId);
    v.setImageResource(R.drawable.search_btn);
    super.onPrepareOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

这个非常大的图标的借口(我还没有调整图标大小),但它应该可以正常工作.

在此输入图像描述


小智 17

我也在努力解决这个问题,但后来我偶然使用了'collapseActionView'并修复了它!我的menu.xml现在看起来像这样:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_search"
      android:title="@string/menu_search"
      android:showAsAction="always|withText|collapseActionView"
      android:actionViewClass="android.widget.SearchView"
      android:icon="@android:drawable/ic_menu_search" /> 
</menu>
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是,在平板电脑上,SearchView将显示在ActionBar的左侧而不是搜索图标的位置,但我不介意.

  • 我尝试了这个,它确实不起作用.展开搜索视图后,按后退按钮无法正确关闭它.相反,旧图标显示在操作栏的左侧.需要再按一下按钮才能正确隐藏它. (2认同)

小智 14

我定义了一种风格来做到这一点.

这是我的xml:

  <android.support.v7.widget.SearchView
        android:id="@+id/sv_search"
        android:icon="@android:drawable/ic_menu_search"
        android:layout_width="fill_parent"
        **style="@style/CitySearchView"**
        android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

这是我的风格:

<style name="CitySearchView" parent="Base.Widget.AppCompat.SearchView">
    <item name="searchIcon">@drawable/ic_more_search</item>
</style>
Run Code Online (Sandbox Code Playgroud)

那个!

完成后,只需看看Base.Widget.AppCompat.SearchView.

<style name="Base.Widget.AppCompat.SearchView" parent="android:Widget">
    <item name="layout">@layout/abc_search_view</item>
    <item name="queryBackground">@drawable/abc_textfield_search_material</item>
    <item name="submitBackground">@drawable/abc_textfield_search_material</item>
    <item name="closeIcon">@drawable/abc_ic_clear_mtrl_alpha</item>
    <item name="searchIcon">@drawable/abc_ic_search_api_mtrl_alpha</item>
    <item name="goIcon">@drawable/abc_ic_go_search_api_mtrl_alpha</item>
    <item name="voiceIcon">@drawable/abc_ic_voice_search_api_mtrl_alpha</item>
    <item name="commitIcon">@drawable/abc_ic_commit_search_api_mtrl_alpha</item>
    <item name="suggestionRowLayout">@layout/abc_search_dropdown_item_icons_2line</item>
</style>
Run Code Online (Sandbox Code Playgroud)

通过定义新样式可以覆盖每个项目.

希望能帮助到你!


Die*_*ino 13

有办法做到这一点.诀窍是使用其标识符恢复ImageView并使用设置新图像setImageResource().此解决方案的灵感来自于更改searchview小部件的背景drawable.

private SearchView searchbox;

private void customizeSearchbox() {
    setSearchHintIcon(R.drawable.new_search_icon);
}

private void setSearchHintIcon(int resourceId) {
    ImageView searchHintIcon = (ImageView) findViewById(searchbox, 
        "android:id/search_mag_icon");
    searchHintIcon.setImageResource(resourceId);
}

private View findViewById(View v, String id) {
    return v.findViewById(v.getContext().getResources().
        getIdentifier(id, null, null));        
}
Run Code Online (Sandbox Code Playgroud)


小智 6

SearchView searchView =(SearchView)findViewById(R.id.address_search);

    try {
        Field searchField = SearchView.class
                .getDeclaredField("mSearchButton");
        searchField.setAccessible(true);
        ImageView searchBtn = (ImageView) searchField.get(searchView);
        searchBtn.setImageResource(R.drawable.search_glass);
    } catch (NoSuchFieldException e) {
    } catch (IllegalAccessException e) {
    }
Run Code Online (Sandbox Code Playgroud)


zna*_*nat 5

经过一番研究,我找到了解决办法在这里.诀窍是,该图标是不是在ImageView中,但Spannable对象.

// Accessing the SearchAutoComplete
int queryTextViewId = getResources().getIdentifier("android:id/search_src_text", null, null);  
View autoComplete = searchView.findViewById(queryTextViewId);

Class<?> clazz = Class.forName("android.widget.SearchView$SearchAutoComplete");

SpannableStringBuilder stopHint = new SpannableStringBuilder("   ");  
stopHint.append(getString(R.string.your_new_text));

// Add the icon as an spannable
Drawable searchIcon = getResources().getDrawable(R.drawable.ic_action_search);  
Method textSizeMethod = clazz.getMethod("getTextSize");  
Float rawTextSize = (Float)textSizeMethod.invoke(autoComplete);  
int textSize = (int) (rawTextSize * 1.25);  
searchIcon.setBounds(0, 0, textSize, textSize);  
stopHint.setSpan(new ImageSpan(searchIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Set the new hint text
Method setHintMethod = clazz.getMethod("setHint", CharSequence.class);  
setHintMethod.invoke(autoComplete, stopHint);
Run Code Online (Sandbox Code Playgroud)


Pne*_*nic 5

在菜单 xml 中:

<item
    android:id="@+id/menu_filter"
    android:actionLayout="@layout/menu_filter"
    android:icon="@drawable/ic_menu_filter"
    android:orderInCategory="10"
    android:showAsAction="always"
    android:title="@string/menu_filter"/>
Run Code Online (Sandbox Code Playgroud)

并创建layout/menu_filter

<?xml version="1.0" encoding="utf-8"?>
<SearchView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:searchIcon="@drawable/ic_menu_filter"/>
Run Code Online (Sandbox Code Playgroud)

然后在活动中onCreateOptionsMenuonPrepareOptionsMenu

SearchView searchView = (SearchView) menu.findItem(R.id.menu_filter).getActionView();
searchView.setOnQueryTextListener(this);
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,如果你想调用“getActionView”,请使用“app:actionLayout”而不是“android:actionLayout”。 (2认同)

Sni*_*las 3

看起来 actionViewClass 覆盖了图标,并且您似乎无法从此类更改它。

你有两个解决方案: