如何更改SearchView图标颜色?

15
我是一名有用的助手,可以翻译文本。

我知道这个问题已经有很多答案了,如果我没有尝试过这里看到的所有内容,我也不会创建另一个线程。无论如何,问题非常简单。解决方案可以来自XML样式或Java代码(两种解决方案都可以)。我将展示我尝试解决它的所有(大部分)方法。

首先,搜索视图图标似乎是由代码不可变的,因为我无法从中更改任何内容。我的搜索视图在menu.xml中声明为:

<item android:id="@+id/icon_search"
    android:title="Searchador"
    android:icon="@drawable/ic_search_black_24dp" <!-- icon not used by searchview anyway -->
    android:showAsAction="always"
    android:actionViewClass="android.widget.SearchView"
/>

在我的onCreateOptionsMenu中,我有这个

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchMenuItem = menu.findItem(R.id.icon_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(false);
searchView.setOnQueryTextListener(this);
MenuTint.colorIcons(this, menu, Color.BLUE);
return true;

MenuTint.colorIcons(this, menu, Color.BLUE);是我从一个特殊的类这里中找到的,它基本上可以改变所有图标的颜色,但不幸的是对于搜索视图图标无效。

然后我找到一些答案建议使用这样的样式

<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
   <!-- changing my icon, its color and stuff.. -->
   <item name="searchIcon">@drawable/ic_search</item></style>

但是我一直遇到错误:No resource found that matches the given name 'Widget.AppCompat.SearchView'.

后来我发现应该添加android-support-app-compat项目库,而不仅仅是.jar文件。但这并没有起作用。我的意思是,导入成功了,但错误仍然存在。之后,我在某处找到了一些信息,说我应该将project.properties从target=android-19更改为21(或更高版本),但这并没有解决“未找到资源”的错误。

所以,我在这个简单的细节上卡住了,需要改变搜索视图的颜色。

此外,虽然这不完全是同样的问题,但我相信它可能通过相同的方式解决,所以我在这里包含了这个问题:我想改变图标之间的距离。有人提出了以下解决方案:

<style name="ActionButtonStyle" parent="AppBaseTheme">
    <item name="android:minWidth">0dip</item>
    <item name="android:paddingLeft">0dip</item>
    <item name="android:paddingRight">0dip</item>                  
</style>

但最终我得到了this
正如您所看到的,这种方法仅适用于我的自定义图标,而不适用于搜索视图图标,也不适用于菜单溢出图标。我希望能够平等地改变所有图标之间的距离。
10个回答

21

对于 android.x

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    ...

    ImageView searchIcon= 
    searchView.findViewById(androidx.appcompat.R.id.search_mag_icon);

    // To change color of close button, use:
    // ImageView searchCloseIcon = (ImageView)searchView
    //        .findViewById(androidx.appcompat.R.id.search_close_btn);

    searchIcon.setColorFilter(getResources().getColor(R.color.colorPrimary),
            android.graphics.PorterDuff.Mode.SRC_IN);

    ...

    return true;

}

1
为了进一步完善这个非常有用的答案,searchView.findViewById(androidx.appcompat.R.id.search_mag_icon) 中的 search_mag_icon、search_button 等都是自动提供的,这些 ID 不是由您定义的。您需要从自动完成的可用建议中进行选择。 - Show Young Soyinka
3
我正在使用androidx.appcompat:appcompat:1.2.0,但是找不到该视图。 - John Glen
如果像我一样,使用自定义图标作为搜索图标,请使用searchView.findViewById(androidx.appcompat.R.id.search_button)。 - John T

19
如果您想更改SearchView的搜索图标,只需按以下方式获取视图中的图像视图:
searchView = v.findViewById(R.id.searchView);
//change icon color
ImageView searchIcon = searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
searchIcon.setImageDrawable(ContextCompat.getDrawable(getActivity(),R.drawable.ic_search_icon));

图标必须为R.id.search_button,您可以将其替换为您提供的白色矢量图像,例如R.drawable.ic_search_icon

同样,您可以按以下方式更改SearchView中的文本:

//set color to searchview
SearchView.SearchAutoComplete searchAutoComplete = searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchAutoComplete.setHintTextColor(getResources().getColorandroid.R.color.white));
searchAutoComplete.setTextColor(getResources().getColor(android.R.color.white));

1
如果我想使用系统搜索按钮,该怎么做? - famfamfam

11
 final SearchView searchViewAndroidActionBar = (SearchView) MenuItemCompat.getActionView(searchViewItem);
        // change close icon color
        ImageView iconClose = (ImageView) searchViewAndroidActionBar.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
        iconClose.setColorFilter(getResources().getColor(R.color.grey));
       //change search icon color
        ImageView iconSearch = searchViewAndroidActionBar.findViewById(android.support.v7.appcompat.R.id.search_button);
        iconSearch.setColorFilter(getResources().getColor(R.color.grey));

9

要更改搜索视图的图标颜色,请使用以下代码:

SearchView searchView = (SearchView) findViewById(R.id.searchview);
ImageView icon = searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
icon.setColorFilter(Color.BLACK);

1
它没有起作用。但是通过使用@Carlos Daniel提供的R.id.search_button而不是您的R.id.search_mag_icon,它正好按照我想要的方式工作。 由于他的答案允许我更改我的图标,因此我将他的答案投票为正确的答案,尽管您的“setcolorfilter”似乎比他的答案中设置可绘制对象更适合我的需求。谢谢。两个都。 - Marcus Casagrande
不用谢,很高兴现在问题已经解决了。我已经编辑了我的答案来解决这个问题,只是忘记编辑那一部分了! - adougies
很好,对我来说完美地运作了。有没有想法如何改变关闭按钮(X)的颜色? - Karl-John Chow

7

您可以通过添加自己的可绘制图标来更改或自定义SearchView的图标。

        <androidx.appcompat.widget.SearchView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        app:closeIcon="@drawable/close_icon"
        app:searchHintIcon="@drawable/search_icon"
        app:searchIcon="@drawable/search_icon"
        android:textStyle="bold" />

2

Use below code:

MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView mSearchView = (SearchView) searchItem.getActionView();
Drawable dr = searchItem.getIcon();
    
dr.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimary), PorterDuff.Mode.SRC_ATOP);

或:

dr.setColorFilter(BlendModeColorFilterCompat
         .createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP));

1
您可以在布局中使用主题 在您的样式文件中定义:
 <style name="YourAppTheme.DarkSearchViewTheme">
    <item name="colorControlNormal">#FFFFFF</item>
 </style>

如果您使用了菜单膨胀,则可以从清单将此主题应用到您的活动中。

或者,如果您在布局中明确使用了SearcView小部件,则可以通过像这样的主题属性将其应用于小部件:

<androidx.appcompat.widget.SearchView
    android:theme="@style/YourAppTheme.DarkSearchViewTheme"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

只需要答案 - undefined

0

我发现在后来的(2020年)appCompat场景中,我在更改图标颜色方面遇到了麻烦,但是找到了一个可行的方法:

(Kotlin)


searchItem.icon.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP)


0
请使用以下代码:
ImageView searchIcon = searchView.findViewById(R.id.search_button);
searchIcon.setColorFilter(Color.WHITE);

如果您想更改关闭图标的颜色,请使用以下代码:

ImageView searchClose = searchView.findViewById(R.id.search_close_btn);
searchIcon.setColorFilter(Color.WHITE);

0

获取你想要着色的Drawable,将其包装在一个着色的drawable中,并将其设置为搜索菜单项的新项:

@JvmStatic
fun getTintedDrawable(inputDrawable: Drawable, @ColorInt color: Int): Drawable {
    val wrapDrawable = DrawableCompat.wrap(inputDrawable.mutate())
    DrawableCompat.setTint(wrapDrawable, color)
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN)
    return wrapDrawable
}

使用方法:

val drawable =getTintedDrawable(...)
searchMenuItem.icon = drawable

而且这应该适用于所有android-x(支持库)支持的Android版本。


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