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

问题描述 投票:0回答:10

我知道这里已经有很多这个问题的答案,如果我还没有尝试过我在这里看到的所有内容,我就不会创建另一个线程。 无论如何,问题很简单。我不介意该解决方案来自 XML 样式还是 Java 代码(两种解决方案都受欢迎)。我会展示我尝试解决的所有问题(无论如何大部分)。

首先,searview 图标似乎通过代码是不可变的,因为我无法更改它的任何内容。我的搜索视图在

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);
我发现了here,它基本上改变了我所有的图标颜色,不幸的是不适用于searchview图标。

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

<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

如您所见,这种方法仅适用于我的自定义图标,但不适用于 searchview 图标,也不适用于菜单溢出图标。我想同等地改变所有图标之间的距离。

android eclipse android-actionbar icons searchview
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;

}

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

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

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
投票

使用以下代码:

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
投票

您可以在布局中使用主题

在您的styles文件中定义:

 <style name="YourAppTheme.DarkSearchViewTheme">
    <item name="colorControlNormal">#FFFFFF</item>
 </style>

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

或者,如果您在 layout 中明确使用 SearcView 小部件,您可以通过主题属性将其应用到您的小部件中,如下所示:

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

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 版本。


0
投票

我发现在后来的(2020 年)appCompat 场景中,我在更改图标颜色时遇到了麻烦,但发现这个可以工作:

(科特林)


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);
searchClose.setColorFilter(Color.WHITE);
© www.soinside.com 2019 - 2024. All rights reserved.