Java SearchView.OnCloseListener未被调用
我正在使用一个操作栏并向其中添加一个searchView。我已经实现了searchView.onCLoseListener,但似乎没有调用它。有什么建议吗 我的代码如下所示:Java SearchView.OnCloseListener未被调用,java,android,android-widget,searchview,Java,Android,Android Widget,Searchview,我正在使用一个操作栏并向其中添加一个searchView。我已经实现了searchView.onCLoseListener,但似乎没有调用它。有什么建议吗 我的代码如下所示: SearchView searchView = new SearchView(getContext()); searchView.setOnCloseListener(new OnCloseListener() { public boolean onClose() { searchView.setVisibi
SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener() {
public boolean onClose() {
searchView.setVisibility(SearchView.GONE);
// Do Something
return true;
}
});
嗯。我弄错了。我们无法添加searchCommand和do
setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)
这样做将删除searchText(如果有),因此我们无法执行onClose()。我所做的是解决类似问题,我创建了一个扩展SearchView的新类:
public class EnglishVerbSearchView extends SearchView {
OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener;
public EnglishVerbSearchView(Context context) {
super(context);
}
@Override
public void onActionViewCollapsed() {
if (mSearchViewCollapsedEventListener != null)
mSearchViewCollapsedEventListener.onSearchViewCollapsed();
super.onActionViewCollapsed();
}
public interface OnSearchViewCollapsedEventListener{
public void onSearchViewCollapsed();
}
public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) {
mSearchViewCollapsedEventListener = eventListener;
}
}
然后,您可以在菜单xml文件中使用此类而不是SearchView:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/action_search"
yourapp:showAsAction="ifRoom|collapseActionView"
yourapp:actionViewClass="com.szymontrapp.englishverbs.EnglishVerbSearchView" />
</menu>
您还可以重写类中替代SearchView的其他方法以实现其他目标。我在android 4.1.1上遇到了同样的问题。看起来这是一个已知的bug: 无论如何,作为一种解决方法,我使用了状态更改侦听器(当SearchView从操作栏分离时,它显然也是关闭的)
以上代码在我的示例中运行良好。为了在单击“x”图标时得到通知,我在SearchView“x”按钮中添加了一个单击侦听器 按id查找SearchView“x”按钮并附加OnClickListener:
mSearchView.findViewById(R.id.search_close_btn)
.setOnClickListener(this);
视图搜索\u close\u btn出现在Android框架提供的SearchView布局中。以便从SearchView.OnCloseListener调用onClose()方法。我用下面的方法使它工作。
将此添加到您的searchview
searchView.setIconifiedByDefault(true);
searchView.setOnCloseListener(this);
现在实现这个onclick侦听器
searchView.findViewById(R.id.search_close_btn)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("called","this is called.");
searchView.setQuery("",false);
searchView.setIconified(true);
}
});
这对我有用。分享,这样它也能帮助别人。
谢谢
更多信息请点击此处:如果您已设置
searchView.setIconifiedByDefault(false)
然后,您的searchView永远不会关闭,因为它始终处于展开模式。这就是没有调用onClose()的原因。创建菜单项时将
app:showAsAction
设置为“始终”
<item
android:id="@+id/action_search"
android:title="..."
android:icon="..."
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
search.setIconifiedByDefault(true)
需要设置为true
,以调用上面创建的SearchView.OnCloseListener()
上的onClose()
方法。我也发现了这个问题。解决方案非常简单!只需将您的SearchView
视图存储在private var中,然后使用
检查视图是否已展开的方法isShown
确定searchview.addOnLayoutChange
在执行操作后开始使用searchview
isShown
- 使用if
覆盖block(searchView!=null&&searchView.isShown()
,然后在用户单击后退按钮时执行操作onBackPressed
- 并用
块覆盖isShown
中的OnOptions ItemSelected
按钮侦听器。 注意:在菜单项xml文件中删除应用程序:showAsAction collapseActionView标志home(back)
MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when action item collapses
/*Hiding the mic on search visibility*/
myMenu.findItem(R.id.action_speak).setVisible(false);
Log.v("test","colllapse");
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
Log.v("test","expand");
return true; // Return true to expand action view
}
};
//Searchview Initilisation
MenuItem searchViewItem = menu.findItem(R.id.action_search);
// Assign the listener to that action item
MenuItemCompat.setOnActionExpandListener(searchViewItem, expandListener);
searchView.setIconifiedByDefault(false)
<item
android:id="@+id/action_search"
android:title="..."
android:icon="..."
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
inflater.inflate(R.menu.menu_search, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView search = (SearchView) item.getActionView();
search.setQueryHint(getString(R.string.search_brand_item));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// add your code
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// add your code
return false;
}
});
search.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
// add your code here
return false;
}
});
search.setIconifiedByDefault(true); // make sure to set this to true