如何更改搜索视图图标颜色?
How to change searchview icon color?
我知道这里已经有很多关于这个问题的答案,如果我没有尝试过我在这里看到的所有内容,我就不会创建另一个线程。
无论如何,问题很简单。我不介意解决方案是来自 XML 样式还是 Java 代码(欢迎两种解决方案)。我会展示我尝试解决的所有问题(无论如何大部分)。
首先,searview 图标似乎无法通过代码更改,因为我无法更改它的任何内容。我的搜索视图在 menu.xml
中声明为 this
<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;
我从一个特殊的 class 获得的 MenuTint.colorIcons(this, menu, Color.BLUE);
我发现 here 它基本上改变了我所有图标的颜色,不幸的是不适用于搜索视图图标。
然后我找到了一些建议使用这样的样式的答案
<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(或更高)但它没有解决 "No resource found" 错误。
所以我对这个我需要更改搜索视图颜色的简单细节非常困惑。
此外,这不是完全相同的问题,但我相信它可能会以相同的方式解决,所以我将在此处包括:我想更改图标之间的距离。有人提出了这个解决方案
<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的搜索图标,你只需要在视图中获取图像视图,如下所示:
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));
要更改搜索视图的图标颜色,请使用以下代码行:
SearchView searchView = (SearchView) findViewById(R.id.searchview);
ImageView icon = searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
icon.setColorFilter(Color.BLACK);
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));
将要着色的 Drawable 用着色的 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 版本。
对于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;
}
使用以下代码:
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);
我发现在后来的 (2020) appCompat 场景中,我无法更改图标颜色,但发现这个可以工作:
(科特林)
searchItem.icon.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP)
您可以通过添加您自己的可绘制图标来更改或自定义 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" />
使用以下代码:
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));
我知道这里已经有很多关于这个问题的答案,如果我没有尝试过我在这里看到的所有内容,我就不会创建另一个线程。 无论如何,问题很简单。我不介意解决方案是来自 XML 样式还是 Java 代码(欢迎两种解决方案)。我会展示我尝试解决的所有问题(无论如何大部分)。
首先,searview 图标似乎无法通过代码更改,因为我无法更改它的任何内容。我的搜索视图在 menu.xml
中声明为 this
<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;
我从一个特殊的 class 获得的 MenuTint.colorIcons(this, menu, Color.BLUE);
我发现 here 它基本上改变了我所有图标的颜色,不幸的是不适用于搜索视图图标。
然后我找到了一些建议使用这样的样式的答案
<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(或更高)但它没有解决 "No resource found" 错误。
所以我对这个我需要更改搜索视图颜色的简单细节非常困惑。
此外,这不是完全相同的问题,但我相信它可能会以相同的方式解决,所以我将在此处包括:我想更改图标之间的距离。有人提出了这个解决方案
<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的搜索图标,你只需要在视图中获取图像视图,如下所示:
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));
要更改搜索视图的图标颜色,请使用以下代码行:
SearchView searchView = (SearchView) findViewById(R.id.searchview);
ImageView icon = searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
icon.setColorFilter(Color.BLACK);
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));
将要着色的 Drawable 用着色的 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 版本。
对于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;
}
使用以下代码:
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);
我发现在后来的 (2020) appCompat 场景中,我无法更改图标颜色,但发现这个可以工作:
(科特林)
searchItem.icon.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.SRC_ATOP)
您可以通过添加您自己的可绘制图标来更改或自定义 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" />
使用以下代码:
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));