设置 SearchView 清除按钮颜色
Set SearchView clear button color
我正在使用 onCreateOptionsMenu
在工具栏中创建一个搜索视图,但无法使清晰的 X
按钮最初为白色。开始输入字母时会变成白色。清除后它也保持白色。
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.responsible_menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); //TODO: May not be needed?
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
{
@Override
public boolean onQueryTextSubmit(String query)
{
mAdapter.updateUIWithFilter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText)
{
mAdapter.updateUIWithFilter(newText);
return false;
}
});
// Does not work! Still not white.
ImageView searchClose = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
searchClose.setColorFilter(Color.argb(255, 255, 255, 255));
searchClose.setAlpha(255);
return true;
}
responsible_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:appcompat="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/tools">
<item
android:id="@+id/menu_search"
android:title="@string/search"
appcompat:actionViewClass="android.support.v7.widget.SearchView"
appcompat:showAsAction="always"/>
</menu>
找到解决办法。但是,对更好的感兴趣。
从 https://www.google.com/design/icons/#ic_clear 下载了 24pt 白色的“清除按钮”图像,并将此代码添加到 onCreateOptionsMenu
的末尾
// Does help!
ImageView searchClose = (ImageView) searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
searchClose.setImageResource(R.drawable.ic_clear_white_24dp);
您可以使用自己的自定义图标代替搜索视图默认的取消图标。
我使用了下面的代码,效果很好,希望对你有用。
private void setCloseSearchIcon(SearchView searchView) {
try {
Field searchField = SearchView.class.getDeclaredField("mCloseButton");
searchField.setAccessible(true);
ImageView closeBtn = (ImageView) searchField.get(searchView);
closeBtn.setImageResource(R.drawable.ic_close);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
这将在 api 14 级以上工作。
Kotlin
private fun configureCloseButton(searchView: SearchView) {
val searchClose = searchView.javaClass.getDeclaredField("mCloseButton")
searchClose.isAccessible = true
val closeImage = searchClose.get(searchView) as ImageView
closeImage.setImageResource(R.drawable.arrow_back_gray) // your image here
}
您也可以从 XML 进行设置。我正在使用支持库 24.2.1 和一个 activity,其父主题是 "Theme.AppCompat.Light" 和 ActionBar 中的 android.support.v7.widget.SearchView。
您可以像这样在 activity 主题中设置 actionBarWidgetTheme:
<style name="ActivityTheme" parent="Theme.AppCompat.Light">
<item name="actionBarWidgetTheme">@style/MyActionBarWidgetTheme</item>
</style>
然后定义 MyActionBarWidgetTheme 并在那里设置你想要的颜色:
<style name="MyActionBarWidgetTheme">
<item name="android:textColorSecondary">@android:color/white</item>
</style>
android:textColorSecondary应用于关闭图标
android:textColorPrimary 适用于您输入的文本
colorControlActivated 应用于光标
android:textColorHint应用于提示文字
试试这个:
ImageView searchClose = searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
searchClose.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
有更好的解决方案。
如 https://android-developers.googleblog.com/2014/10/appcompat-v21-material-design-for-pre.html“SearchView 小部件”部分所述,只需使用:
<style name=”Theme.MyTheme” parent=”Theme.AppCompat”>
<item name=”searchViewStyle”>@style/MySearchViewStyle</item>
</style>
<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
<!-- Background for the search query section (e.g. EditText) -->
<item name="queryBackground">...</item>
<!-- Background for the actions section (e.g. voice, submit) -->
<item name="submitBackground">...</item>
<!-- Close button icon -->
<item name="closeIcon">...</item>
<!-- Search button icon -->
<item name="searchIcon">...</item>
<!-- Go/commit button icon -->
<item name="goIcon">...</item>
<!-- Voice search button icon -->
<item name="voiceIcon">...</item>
<!-- Commit icon shown in the query suggestion row -->
<item name="commitIcon">...</item>
<!-- Layout for query suggestion rows -->
<item name="suggestionRowLayout">...</item>
</style>
closeIcon
就是您要找的。
自定义关闭图标示例(只需更改fillColor
):
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#ffffff"
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>
我根据带有特定清单的可搜索 Activity 和带有 app:actionViewClass="androidx.appcompat.widget.SearchView"
的 options_menu
文件在官方配置上对其进行了测试:https://developer.android.com/training/search/setup
对于 android x
ImageView ivClose = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
更改分辨率图像
ivClose.setImageResource(R.drawable.ic_clear_white_24dp);
或者只是改变色调
ivClose.setColorFilter(ContextCompat.getColor(mContext, R.color.white), android.graphics.PorterDuff.Mode.SRC_IN);
我正在使用 onCreateOptionsMenu
在工具栏中创建一个搜索视图,但无法使清晰的 X
按钮最初为白色。开始输入字母时会变成白色。清除后它也保持白色。
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.responsible_menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); //TODO: May not be needed?
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
{
@Override
public boolean onQueryTextSubmit(String query)
{
mAdapter.updateUIWithFilter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText)
{
mAdapter.updateUIWithFilter(newText);
return false;
}
});
// Does not work! Still not white.
ImageView searchClose = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
searchClose.setColorFilter(Color.argb(255, 255, 255, 255));
searchClose.setAlpha(255);
return true;
}
responsible_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:appcompat="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/tools">
<item
android:id="@+id/menu_search"
android:title="@string/search"
appcompat:actionViewClass="android.support.v7.widget.SearchView"
appcompat:showAsAction="always"/>
</menu>
找到解决办法。但是,对更好的感兴趣。
从 https://www.google.com/design/icons/#ic_clear 下载了 24pt 白色的“清除按钮”图像,并将此代码添加到 onCreateOptionsMenu
// Does help!
ImageView searchClose = (ImageView) searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
searchClose.setImageResource(R.drawable.ic_clear_white_24dp);
您可以使用自己的自定义图标代替搜索视图默认的取消图标。
我使用了下面的代码,效果很好,希望对你有用。
private void setCloseSearchIcon(SearchView searchView) {
try {
Field searchField = SearchView.class.getDeclaredField("mCloseButton");
searchField.setAccessible(true);
ImageView closeBtn = (ImageView) searchField.get(searchView);
closeBtn.setImageResource(R.drawable.ic_close);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
这将在 api 14 级以上工作。
Kotlin
private fun configureCloseButton(searchView: SearchView) {
val searchClose = searchView.javaClass.getDeclaredField("mCloseButton")
searchClose.isAccessible = true
val closeImage = searchClose.get(searchView) as ImageView
closeImage.setImageResource(R.drawable.arrow_back_gray) // your image here
}
您也可以从 XML 进行设置。我正在使用支持库 24.2.1 和一个 activity,其父主题是 "Theme.AppCompat.Light" 和 ActionBar 中的 android.support.v7.widget.SearchView。
您可以像这样在 activity 主题中设置 actionBarWidgetTheme:
<style name="ActivityTheme" parent="Theme.AppCompat.Light">
<item name="actionBarWidgetTheme">@style/MyActionBarWidgetTheme</item>
</style>
然后定义 MyActionBarWidgetTheme 并在那里设置你想要的颜色:
<style name="MyActionBarWidgetTheme">
<item name="android:textColorSecondary">@android:color/white</item>
</style>
android:textColorSecondary应用于关闭图标
android:textColorPrimary 适用于您输入的文本
colorControlActivated 应用于光标
android:textColorHint应用于提示文字
试试这个:
ImageView searchClose = searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
searchClose.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
有更好的解决方案。 如 https://android-developers.googleblog.com/2014/10/appcompat-v21-material-design-for-pre.html“SearchView 小部件”部分所述,只需使用:
<style name=”Theme.MyTheme” parent=”Theme.AppCompat”>
<item name=”searchViewStyle”>@style/MySearchViewStyle</item>
</style>
<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
<!-- Background for the search query section (e.g. EditText) -->
<item name="queryBackground">...</item>
<!-- Background for the actions section (e.g. voice, submit) -->
<item name="submitBackground">...</item>
<!-- Close button icon -->
<item name="closeIcon">...</item>
<!-- Search button icon -->
<item name="searchIcon">...</item>
<!-- Go/commit button icon -->
<item name="goIcon">...</item>
<!-- Voice search button icon -->
<item name="voiceIcon">...</item>
<!-- Commit icon shown in the query suggestion row -->
<item name="commitIcon">...</item>
<!-- Layout for query suggestion rows -->
<item name="suggestionRowLayout">...</item>
</style>
closeIcon
就是您要找的。
自定义关闭图标示例(只需更改fillColor
):
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#ffffff"
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>
我根据带有特定清单的可搜索 Activity 和带有 app:actionViewClass="androidx.appcompat.widget.SearchView"
的 options_menu
文件在官方配置上对其进行了测试:https://developer.android.com/training/search/setup
对于 android x
ImageView ivClose = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
更改分辨率图像
ivClose.setImageResource(R.drawable.ic_clear_white_24dp);
或者只是改变色调
ivClose.setColorFilter(ContextCompat.getColor(mContext, R.color.white), android.graphics.PorterDuff.Mode.SRC_IN);