简短:当我单击 SearchViewIcon 时,SearchView 不会折叠/展开。
长:
我正在使用 SearchView 来过滤 MainActivity 中 Fragment 中的 RecyclerView。
当我单击 SearchViewIcon 时(SearchView 默认情况下是图标化的)。我使用以下代码打开包含正确片段的选项卡:
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(2, false);
}
});
具有正确片段的选项卡将按预期打开。还显示文本输入,但 SearchView 保持图标化。 (见下图。)
我的 XML 搜索视图:
<item
android:id="@+id/action_search"
android:orderInCategory="1"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/menu_item_search_title"
app:showAsAction="ifRoom"
app:queryHint="Search name or function"
app:actionViewClass="android.support.v7.widget.SearchView" />
我已经尝试过的事情:
将我的 showAsAction 设置为始终或 ifRoom|collapseActionView
app:showAsAction="always"
app:showAsAction="ifRoom|collapseActionView"
请求关注我的 SearchView:
searchView.requestFocus();
扩展我的SearchViewItem:
MenuItem searchViewItem = menu.findItem(R.id.action_search);
searchViewItem.expandActionView();
但是这些东西都不起作用......
编辑 就像标题所说,如果我再次单击 SearchViewIcon,SearchView 就会展开。
我也遇到过类似的问题,并且已经解决了。 我需要解决的主要问题是:
解决方案:
app:showAsAction
定义为"collapseActionView"
+在java代码中还需要调用searchView.setIconifiedByDefault(false)
来使展开优先于图标化(即-当按下图标时,展开而不是保持图标模式)MenuItem.OnActionExpandListener
添加一个 search menu-item object
并使用处理程序发布一个可运行的文件,该可运行文件将请求焦点到您的 search-view object
。
(为什么是可运行的?因为在菜单尚未完全膨胀时请求焦点并不能保证有效。在处理程序可运行中请求焦点时,我确保焦点请求在 onCreateOptionsMenu()
中的所有工作准备就绪之后发生并完成了。解决所有这些问题的完整代码:
菜单.xml:
<item
android:id="@+id/searchContacts"
android:icon="@drawable/ic_search_white_24dp"
android:title="search"
app:showAsAction="collapseActionView|always"
app:actionViewClass="android.widget.SearchView"
/>
<!-- and of course your other menu items -->
可搜索配置:
需要创建这样的xml文件。 右键单击您的
res
文件夹并选择 new --> android resource file
。输入您想要的任何内容作为文件名(例如,“可搜索”就可以),然后选择 XML
作为资源类型。
然后将此代码复制并粘贴到创建的文件中(用您自己的提示字符串替换提示字符串):
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="put here your hint string to be shown"
/>
主要活动:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu, menu);
implementSearch(menu);
return true;
}
private void implementSearch(final Menu menu) {
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final MenuItem searchMenuItem = menu.findItem(R.id.searchContacts);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener(){
@Override
public boolean onMenuItemActionExpand(MenuItem item){
// the search view is now open. add your logic if you want
new Handler().post(new Runnable() {
@Override
public void run() {
searchView.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) { // it's never null. I've added this line just to make the compiler happy
imm.showSoftInput(searchView.findFocus(), 0);
}
}
});
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item){
// the search view is closing. add your logic if you want
return true;
}
});
}
此外,如果您想使用自己的回调来更改搜索的文本并提交(而不是 Android 意图),请在
implementSearch()
方法中添加对 searchMenuItem.setOnActionExpandListener(new SearchView.OnQueryTextListener({...}))
的调用。
查看这个问题了解更多详情
最简单的解决方案是使用
always
选项来 app:showAsAction
:
app:showAsAction="always"
<item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="search"
app:showAsAction="always"
app:actionViewClass="android.widget.SearchView"
/>
感谢上面的赞成答案,这就是我所做的
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.contacts_menu, menu)
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
val searchItem = menu.findItem(R.id.action_search)
val searchView = searchItem.actionView as SearchView
searchView.queryHint = "Search contacts"
searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName))
searchView.isIconifiedByDefault = false
searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
Handler(Looper.getMainLooper()).post {
searchView.requestFocus()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(searchView.findFocus(), 0)
}
return true
}
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
// Can choose to hide keyboard here
adapter.submitList(originalList)
binding.recyclerView.scrollToPosition(0)
return true
}
})
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
filterContacts(newText.orEmpty())
return true
}
})
return true
}