如何更改 SearchView 默认图标?

Posted

技术标签:

【中文标题】如何更改 SearchView 默认图标?【英文标题】:How to change SearchView default icon? 【发布时间】:2012-12-31 09:13:47 【问题描述】:

我使用“android Action Bar Style Generator”来生成我自己的 Holo 主题。 然后我在操作栏中添加了两个图标,一个用于搜索过滤器,一个用于文件选择器,两个图标都是白色的。文件选择器图标(右侧)看起来不错,但不知何故,搜索图标看起来是深灰色的。在搜索文本视图上键入时,关闭按钮也显示为深灰色。

我尝试更改操作栏和搜索视图的颜色,但没有成功。为什么搜索视图显示这种颜色?怎么改?

非常感谢。

更新:我认为我的应用程序正在使用我的图标,但它没有,它使用默认的搜索视图图标,所以我的问题实际上是,如何更改默认图标搜索视图? menu.xml 文件中的这句话不起作用:

android:icon="@drawable/selectable_header_search"

【问题讨论】:

【参考方案1】:

不幸的是,没有简单的方法可以将SearchView 图标更改为自定义可绘制对象,因为主题属性searchViewSearchIcon 不公开。详情见this答案。

但是,我认为您的问题是由于从错误的主题继承引起的。请使用android:Theme.Holo.Light.DarkActionBar 作为您主题的基础。那么操作栏上的默认图标应该是浅色的。

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    ...
</style> 

【讨论】:

【参考方案2】:

由于 searchViewSearchIcon 属性不公开,您可以使用以下代码更改图标:

int searchIconId = searchView.getContext().getResources().getIdentifier("android:id/search_button",null, null);
ImageView searchIcon = (ImageView) searchView.findViewById(searchIconId);
searchIcon.setImageResource(R.drawable........);

【讨论】:

这会抛出一个 nullPointerException ImageView searchIconView = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_button); searchIconView.setImageResource(R.drawable.ic_nav_search); 将适用于 android 4+【参考方案3】:

尝试在showAsAction中设置这个选项:*MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW*

如果没有此选项,SearchView 不会采用您为操作按钮设置的图标。

menu.add("Search")
            .setIcon(
                    getResources().getDrawable(
                            R.drawable.selectable_header_search))
            .setActionView(searchView)
            .setShowAsAction(
                    MenuItem.SHOW_AS_ACTION_ALWAYS
                            | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
                            | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

【讨论】:

这为我解决了它(自定义图标不起作用),Android 4.1 到 5.0。等效于菜单 XML:app:showAsAction="always|collapseActionView"【参考方案4】:

我发现更改操作栏中默认搜索视图图标的最简单方法是在您的 onPrepareOptionsMenu 中。你可以看到我对类似问题的回答here!

【讨论】:

【参考方案5】:

在您的主题风格中包含以下内容:

<style name="YourTheme.Toolbar">
    <item name="searchViewStyle">@style/YourActionBarSearch</item>
    <item name="editTextColor">@color/your_ab_text_color</item>
    <item name="android:textColorHint">@color/your_ab_hint_color</item>
</style>

您现在可以使用searchViewStyle 定义 SearchView 的样式,editTextColor 将设置搜索框中文本的颜色。通过设置android:textColorHint,您还将设置提示的颜色,例如“搜索……”。

<style name="YourActionBarSearch" parent="@style/Widget.Holo.SearchView">
    <item name="searchIcon">@drawable/ic_ab_search</item>
    <item name="queryBackground">@null</item>
    <item name="submitBackground">@null</item>
    <item name="searchHintIcon">@drawable/ic_ab_small_search</item>
    <item name="defaultQueryHint">@string/toolbar_search_hint</item>
    <item name="closeIcon">@drawable/ic_ab_small_search_close</item>
</style>

这将或多或少地为您的搜索视图设置样式。字段searchIcon 是操作栏中的图标。 searchHintIcon 字段是搜索字段中提示左侧的小图标。 closeIcon 字段是搜索字段右侧的关闭图标。

查看这里,了解更多样式设置:

$ANDROID_SDK/platforms/android-24/data/res/values/styles_holo.xml

【讨论】:

【参考方案6】:

对于像我这样希望找到真正更改图标的方法的人,您可以将其与 actionbar sherlock 一起使用:

        // Getting the 'search_icon'
        ImageView searchIcon = (ImageView)searchView.findViewById(R.id.abs__search_button);
        // Setting background of 'search_plate' to earlier defined drawable.
        searchIcon.setImageResource(R.drawable.search_button_selector); 

你不能用常用的方式android:icon更改默认的,因为与之相关的字段已经被设置为私有。

【讨论】:

以上是关于如何更改 SearchView 默认图标?的主要内容,如果未能解决你的问题,请参考以下文章

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

为 Android TV 应用程序更改 BrowseFragment 的 SearchView 默认图标?

更改 SearchView 上的工具栏颜色/样式单击

我如何更改搜索视图图标的颜色?

在 Android 操作栏中设置 SearchView 的样式

Android SearchView 图标