首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改SearchView上的默认图标,以便在安卓系统的操作栏中使用?

如何更改SearchView上的默认图标,以便在安卓系统的操作栏中使用?
EN

Stack Overflow用户
提问于 2012-05-04 16:58:09
回答 19查看 81.6K关注 0票数 59

我在SearchView中自定义搜索图标时遇到了一些问题。在我看来,图标可以在项目属性中更改,对吧?只需检查下面的代码即可。

谁能告诉我我哪里做错了?

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

代码语言:javascript
运行
复制
<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>

提前谢谢。

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2012-05-04 17:11:13

它看起来像是actionViewClass覆盖了图标,而且看起来你不能从this class更改它。

你有两个解决方案:

我认为在用户体验和平台conformity.

方面,

  • 是最好的选择
票数 3
EN

Stack Overflow用户

发布于 2013-08-21 22:43:21

我找到了另一种方法来改变搜索图标,它与迭戈·皮诺的答案相同,但直接出现在onPrepareOptionsMenu中。

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

代码语言:javascript
运行
复制
<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>

在您的活动中:

代码语言:javascript
运行
复制
@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);
}

我遵循了更改此example中的edittext的示例。

你应该能够对你的SearchView中的所有图标/背景都这样做,为了找到正确的ID,你可以查看here

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

更新2017年11月:

从这个答案开始,android已经更新,可以通过XML更改搜索图标。

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

代码语言:javascript
运行
复制
<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" />

或v21及更高版本:

代码语言:javascript
运行
复制
<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" />

而且还有更多的选择:

代码语言:javascript
运行
复制
closeIcon
commitIcon
goIcon
searchHintIcon
searchIcon
voiceIcon
票数 97
EN

Stack Overflow用户

发布于 2014-08-02 14:17:54

来自@just_user的不错的回答

就我的例子而言,由于我将appcompat v7库用于SearchView + ActionBar,因此我对他的解决方案进行了一些修改,使其与我的项目兼容,因此只要您在添加appcompat v7作为库时没有修改任何内容,它就应该可以工作

XML:

代码语言:javascript
运行
复制
<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>

Java代码:

代码语言:javascript
运行
复制
@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);
}

为这个非常大的图标找借口(我还没有调整图标的大小),但它应该可以按原样工作。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10445760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档