我在SearchView
中实现了一个Android ActionBar
。当SearchView
获得焦点时,右侧的关闭按钮[x]会显示出来。我看了一下其他Android原生应用,比如联系人和Gmail。当SearchView
获得焦点时,不会显示关闭按钮。
如何设置我的SearchView
表现得那样?
答案 0 :(得分:11)
设置searchView.setIconifiedByDefault(false)
将禁用折叠搜索视图,同时删除关闭按钮。
答案 1 :(得分:10)
我遇到android.support.v7.widget.SearchView
同样的问题并找到了解决方案。首先,在onCreateOptionsMenu
中,您可以获得对SearchView及其关闭按钮的引用:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.search, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
try {
Field searchField = SearchView.class.getDeclaredField("mCloseButton");
searchField.setAccessible(true);
mSearchCloseButton = (ImageView) searchField.get(mSearchView);
} catch (Exception e) {
Log.e(TAG, "Error finding close button", e);
}
}
现在您可以尝试修改按钮。首先,我尝试使用setVisibility(View.GONE)
隐藏关闭按钮,但这不起作用,因为当用户与SearchView交互时,SearchView会重置其关闭按钮的可见性。所以我的解决方案是使用透明drawable并禁用单击关闭按钮:
if (mSearchCloseButton != null) {
mSearchCloseButton.setEnabled(false);
mSearchCloseButton.setImageDrawable(getResources().getDrawable(R.drawable.transparent));
}
这篇文章对我有帮助:
http://novoda.com/blog/styling-actionbar-searchview
然而,诚实地说,这是非常hacky。从https://android.googlesource.com/platform/frameworks/support.git/+/master/v7/appcompat/src/android/support/v7/widget/SearchView.java获取SearchView源并创建自己的SearchView版本可以更加清晰,它可以隐藏/显示关闭按钮。
更新:
谷歌刚刚发布了AppCompat v21,它对SearchView小部件进行了样式改进:
http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html
答案 2 :(得分:6)
您可以从SearchView对象(AppCompat v23.2.1)获取该按钮的链接:
searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
ImageView mCloseButton = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
然后您可以为SearchView文本更改分配一个侦听器(SearchView也会更改按钮的可见性,但之后将执行侦听器并将覆盖这些更改):
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mCloseButton.setVisibility(newText.isEmpty() ? View.GONE : View.VISIBLE);
return false;
}
});
最后,当SearchView从图标化状态扩展时,监听器隐藏图标:
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// hide "x" button if there is no text
String query = searchView.getQuery().toString();
mCloseButton.setVisibility(query.isEmpty() ? View.GONE : View.VISIBLE);
}
});
答案 3 :(得分:6)
您也可以使用它来隐藏关闭按钮
ImageView closeBtn = (ImageView) searchView.findViewById(R.id.search_close_btn);
closeBtn.setEnabled(false);
closeBtn.setImageDrawable(null);
答案 4 :(得分:0)
为将来的访客发布信息。以前的答案很旧,并不容易。您要做的就是以这种方式app:closeIcon
app:closeIcon="@null"
<androidx.appcompat.widget.SearchView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:closeIcon="@null" <!-- This simple solution -->
app:iconifiedByDefault="false" />
答案 5 :(得分:0)
在AndroidX
下,android.support.v7.appcompat.R.id.search_close_btn
无法正常工作
这可以解决问题,
app:closeIcon="@null"