学向勤中得,萤窗万卷书。这篇文章主要讲述如何更改SearchView上的默认图标,以便在Android的操作栏中使用?相关的知识,希望能为你提供帮助。
我在SearchView中自定义搜索图标时遇到了一些麻烦。在我看来,可以在Item属性中更改图标,对吧?只需检查下面的代码..
有人能告诉我我做错了什么吗?
【如何更改SearchView上的默认图标,以便在Android的操作栏中使用()】这是我正在使用的菜单,我的自定义搜索图标icn_lupa。但是当我运行应用程序时,我总是会得到默认的搜索图标......
<
menu xmlns:android="http://schemas.android.com/apk/res/android">
<
item android:id="@+id/menu_search"
android:title="@string/menu_search"
android:icon="@drawable/icn_lupa"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView" />
<
/menu>
提前致谢。
答案看起来actionViewClass会覆盖图标,看起来你不能从this class更改它。
你有两个解决方案:
- 与它一起生活,我认为这是用户体验和平台整合方面的最佳选择。
- Define your own actionViewClass
android:searchIcon="@drawable/loupe"
android:closeIcon="@drawable/x_white"
另一答案对于api级别< 21,我这样做了:
int searchImgId = getResources().getIdentifier("android:id/search_mag_icon", null, null);
ImageView ivIcon = (ImageView) searchView.findViewById(searchImgId);
if(ivIcon!=null)
ivIcon.setImageResource(R.drawable.ic_search);
由此
对此
另一答案
<
SearchView
android:searchIcon="@drawable/ic_action_search"
..../>
使用searchIcon xml标记
另一答案英文xml:
<
item
android:id="@+id/menu_filter"
android:actionLayout="@layout/menu_filter"
android:icon="@drawable/ic_menu_filter"
android:orderInCategory="10"
android:showAsAction="always"
android:title="@string/menu_filter"/>
并创建
layout/menu_filter
:<
?xml version="1.0" encoding="utf-8"?>
<
SearchView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:searchIcon="@drawable/ic_menu_filter"/>
然后在活动的
onCreateOptionsMenu
或onPrepareOptionsMenu
:SearchView searchView = (SearchView) menu.findItem(R.id.menu_filter).getActionView();
searchView.setOnQueryTextListener(this);
另一答案有三个放大镜图标。当IconizedByDefault为true时显示其中两个(一个在按下之前显示,一个在“提示”中显示),一个在IconizedByDefault为false时显示。所有字段都是私有的,因此获取它们的方式是通过xml id。 (大部分代码已经在本文的其他答案中单独提及)
当IconizedByDefault为true时,通过以下方式更改提示中的图标(仅在按下图标后才能看到):
mSearchSrcTextView = (SearchAutoComplete)findViewById(R.id.search_src_text);
然后在android源代码中执行相同的操作:
final int textSize = (int) (mSearchSrcTextView.getTextSize() * 1.25);
newSearchIconDrawable.setBounds(0, 0, textSize, textSize);
final SpannableStringBuilder ssb = new SpannableStringBuilder("");
ssb.setSpan(new ImageSpan(newSearchIconDrawable), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.append(hintText);
mSearchHintIcon替换为newSearchIconDrawable,这是您的新搜索图标。然后设置提示
mSearchSrcTextView.setHint(ssb);
其他2个图标位于
ImageView
中,可以通过Id找到。关闭searchview时的图标(当iconizedByDefault为true时)执行:mSearchButton = (ImageView) findViewById(R.id.search_button);
以及总是出现的那个(如果iconizedByDefault为false)
mCollapsedIcon = (ImageView) findViewById(R.id.search_mag_icon);
另一答案我的解决方案:使用两个菜单xml文件。在其中一个xmls中,菜单项有一个actionView,另一个没有。最初膨胀折叠菜单,当单击菜单项时,使菜单无效并膨胀展开的菜单xml并确保调用setIconified(false);
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
if(!mShowSearchView)
{
inflater.inflate(R.menu.menu_collapsed, menu);
}
else
{
inflater.inflate(R.menu.menu_expanded, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setIconified(false);
searchView.setOnCloseListener(new OnCloseListener()
{
@Override
public boolean onClose()
{
mShowSearchView = false;
ActivityCompat.invalidateOptionsMenu(getActivity());
return false;
}
});
}
super.onCreateOptionsMenu(menu, inflater);
}@Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (item.getItemId() == R.id.action_filter)
{
menu.showMenu();
}
else if (item.getItemId() == R.id.action_search)
{
mShowSearchView = true;
ActivityCompat.invalidateOptionsMenu(getActivity());
}
return super.onOptionsItemSelected(item);
}
另一答案只需将您的图标命名为与搜索视图使用的图标相同的名称。在编译时,它会将项目中的资源放在库中的图标上。
另一答案使用Kotlin的绝望解决方案
val s = (searchView.getAllChildren().firstOrNull() as? LinearLayout)?.getAllChildren()?.filter { it is AppCompatImageView }?.firstOrNull() as? AppCompatImageView
s?.setImageResource(R.drawable.search)
getAllChildren:
fun ViewGroup.getAllChildren() : ArrayList<
View>
{
val views = ArrayList<
View>
()
for (i in 0..(childCount-1)) {
views.add(getChildAt(i))
}
return views
}
希望它可以帮助某人。
另一答案我使用AppCompat库。是的,指定
android:icon="@drawable/search_icon_png"
不起作用。所以我查看了@ style / Theme.AppCompat的源代码,找到了android使用的图标。<
item name="searchViewSearchIcon">
@drawable/abc_ic_search<
/item>
因此,如果您将可绘制内容中的搜索图标重命名为
abc_ic_search.png
,则此图标将首先呈现为您在app drawable中找到的图标,而不是appcompat drawable文件夹。适合我:)使用此方法,您还可以自定义搜索小部件的关闭和清除图标。
另一答案我找到了另一种改变搜索图标的方法,它与Diego Pino的答案在同一行,但直接在
onPrepareOptionsMenu
。在您的menu.xml中(与之前相同)
<
menu xmlns:android="http://schemas.android.com/apk/res/android">
<
item android:id="@+id/action_search"
android:icon="@drawable/ic_action_fav"
android:title="@string/action_websearch"
android:showAsAction="always|never"
android:actionViewClass="android.widget.SearchView" />
<
/menu>
在您的活动中:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem searchViewMenuItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) searchViewMenuItem.getActionView();
int searchImgId = getResources().getIdentifier("android:id/search_button", null, null);
ImageView v = (ImageView) mSearchView.findViewById(searchImgId);
v.setImageResource(R.drawable.your_new_icon);
mSearchView.setOnQueryTextListener(this);
return super.onPrepareOptionsMenu(menu);
}
我按照这个例子更改了这个example中的edittext。
您应该可以对
SearchView
中的所有图标/背景执行此操作,以找到可以检查here的正确ID。希望这对其他人也有帮助!
2017年11月更新:
由于这个答案android已经更新,可以通过XML更改搜索图标。
如果你的目标是android v21以下,你可以使用:
<
android.support.v7.widget.SearchView
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:searchIcon="@drawable/ic_search_white_24dp"
app:closeIcon="@drawable/ic_clear_white_24dp" />
或者v21及更高版本:
<
SearchView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:searchIcon="@drawable/ic_search_white_24dp"
android:closeIcon="@drawable/ic_clear_white_24dp" />
还有更多选择:
closeIcon
commitIcon
goIcon
searchHintIcon
searchIcon
voiceIcon
另一
推荐阅读
- 如何将浮动操作按钮锚定到App ToolBar,就像在指南图像中一样()
- win8.1系统重置密码找到微软账户密码技巧
- Windows 8正式版提示“Windows无法删除家庭组”处理办法
- Win8系统metro开始界面打开浏览器显示桌面版IE怎样办【图文】
- win8.1安装密钥|win8.1激活密钥 win8.1专业版|企业版|核心版安装密钥
- win8.1 ghost系统如何解压install.Wim取得原版文件【图】
- win8 32位旗舰版系统如何查看是否运用Microsoft账户登入
- win8激活工具一键激活Windows8所有版本【图】
- win8.1专业版下载|win8.1专业版64位、32位下载