SearchView的OnCloseListener不起作用

我试图在Android 3.0 + ActionBar中添加对SearchView支持,但是我无法使OnCloseListener正常工作。

这是我的代码:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView(); searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextChange(String newText) { searchLibrary(newText); return false; } @Override public boolean onQueryTextSubmit(String query) { return false; } }); searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { System.out.println("Testing. 1, 2, 3..."); return false; } }); return true; } 

search工作很好,除了OnCloseListener之外,每个工作都在工作。 没有什么被打印到Logcat。 这里是我按下“closures”button时的Logcat:

 02-17 13:01:52.914: I/TextType(446): TextType = 0x0 02-17 13:01:57.344: I/TextType(446): TextType = 0x0 02-17 13:02:02.944: I/TextType(446): TextType = 0x0 

我已经浏览了文档和示例,但似乎没有任何改变。 我在一个华硕变压器总理和一个银河连结,在冰淇淋三明治上运行它。 有任何想法吗?

更新:

是的 – System.out.println() 确实有效。 这是certificate:

  @Override public boolean onQueryTextChange(String newText) { System.out.println(newText + "hello"); searchLibrary(newText); return false; } 

结果在这个Logcat中:

 02-17 13:04:20.094: I/System.out(21152): hello 02-17 13:04:24.914: I/System.out(21152): thello 02-17 13:04:25.394: I/System.out(21152): tehello 02-17 13:04:25.784: I/System.out(21152): teshello 02-17 13:04:26.064: I/System.out(21152): testhello 

我也遇到这个问题,我别无select,只能放弃“oncloselistener”。 相反,你可以得到你的menuItem,然后setOnActionExpandListener 。 然后重写unimplents方法。

 @Override public boolean onMenuItemActionExpand(MenuItem item) { // TODO Auto-generated method stub Log.d("*******","onMenuItemActionExpand"); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { //do what you want to when close the sesarchview //remember to return true; Log.d("*******","onMenuItemActionCollapse"); return true; } 

对于Android API 14+(ICS及更高版本),请使用以下代码:

 // When using the support library, the setOnActionExpandListener() method is // static and accepts the MenuItem object as an argument MenuItemCompat.setOnActionExpandListener(menuItem, new OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when expanded return true; // Return true to expand action view } }); 

有关更多信息: http : //developer.android.com/guide/topics/ui/actionbar.html#ActionView

参考: onActionCollapse / onActionExpand

对于这个问题,我想出了这样的事情,

 private SearchView mSearchView; @TargetApi(14) @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.conversation_index_activity_menu, menu); mSearchView = (SearchView) menu.findItem(R.id.itemSearch).getActionView(); MenuItem menuItem = menu.findItem(R.id.itemSearch); int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { menuItem.setOnActionExpandListener(new OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed Log.i(TAG, "onMenuItemActionCollapse " + item.getItemId()); return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { // TODO Auto-generated method stub Log.i(TAG, "onMenuItemActionExpand " + item.getItemId()); return true; } }); } else { // do something for phones running an SDK before froyo mSearchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { Log.i(TAG, "mSearchView on close "); // TODO Auto-generated method stub return false; } }); } return super.onCreateOptionsMenu(menu); } 

我遇到了相同的问题在Android 4.1.1。 看起来像是一个已知的错误: https : //code.google.com/p/android/issues/detail?id = 25758

无论如何,作为一个解决方法我使用状态更改侦听器(当SearchView从操作栏分离时,它也明显closures)。

 view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { @Override public void onViewDetachedFromWindow(View arg0) { // search was detached/closed } @Override public void onViewAttachedToWindow(View arg0) { // search was opened } }); 

上面的代码在我的情况下效果很好。


我发布相同的答案在这里: https : //stackoverflow.com/a/24573266/2162924

那么,这解决了我的问题:

带有showAsAction="always"菜单项

 <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="Search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always"/> 

并在活动中

 searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { Log.i("SearchView:", "onClose"); searchView.onActionViewCollapsed(); return false; } }); 

我结束了使用一些黑客,这对我的目的很好 – 不知道它会适用于所有目的。 无论如何,我正在做一个检查,看看search查询是否为空。 这不是真的与SearchViewOnCloseListener相关 – 但仍然不起作用!

 searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextChange(String newText) { if (newText.length() > 0) { // Search } else { // Do something when there's no input } return false; } @Override public boolean onQueryTextSubmit(String query) { return false; } }); 

我遇到了onCloseListener不会调用SearchView相同的问题。 从25758中提出的错误问题,以及我已阅读的一些post了解,要调用onCloseListener,您需要设置:

 searchView.setIconifiedByDefault(true); 

但对于我的情况,我想让search视图一直打开而不是图标化。 我设法通过在下面添加一行来解决这个问题:

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.search_bar, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setOnQueryTextListener(queryTextListener); searchView.setIconifiedByDefault(true); searchView.setIconified(false); return true; } 

searchView.setIconified(false)将导致searchView打开,尽pipe在上一行中将默认设置为true。 通过这种方式,我设法拥有了一个可以随时打开并调用onCloseListener的SearchView。

为了使OnCloseListener工作,请确保showAsAction设置为always在search菜单项中。

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".SearchActivity"> <item android:id="@+id/search" android:title="@string/search" android:icon="@drawable/ic_search_toolbar" app:showAsAction="always" app:actionViewClass="android.support.v7.widget.SearchView"/> </menu> 

对于MenuItemCompat问题,我添加了ViewTreeObserver来跟踪可见性状态。 你可以在这里查看我的答案: https : //stackoverflow.com/a/28762632/1633609

OnCloseListener未被调用的原因是因为Android代码中存在一个错误 – 只有在调用setIconifiedByDefault(true)情况下才会调用该监听器。

似乎已经是一个老的线程了,但是我想我在第一个开始就遇到了同样的问题。 在search了一下后,发现这个线程,又读了一个小时,读了javadoc,尝试了一下,我没有假装完全理解javadoc,现在为我做了以下工作:

 searchView.setIconifiedByDefault(true); // OnQueryTextListener @Override public boolean onQueryTextSubmit(String query) { Log.d(tag, "onQueryTextSubmit: " + query); return true; } @Override public boolean onQueryTextChange(String query) { Log.d(tag, "onQueryTextChange: " + query); return true; } // OnCloseListener @Override public boolean onClose() { Log.w(tag, "onClose: "); return false; } 

我玩了一些真实/错误的东西,不知何故是有所作为,现在对我来说很有效。 希望能省下一些时间。

这是一个解决方法,但已为我工作

  searchView.setOnQueryTextListener(new android.widget.SearchView.OnQueryTextListener() { String lastText; @Override public boolean onQueryTextChange(final String newText) { if (lastText != null && lastText.length() > 1 && newText.isEmpty()) { // close ctn clicked return true; } } 

创buildapp:showAsAction设置为始终的菜单项。

 <item android:id="@+id/action_search" android:title="..." android:icon="..." app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always"/> 

onCreateOptionsMenu方法中创buildSearchView ,请执行类似的操作

 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 

search.setIconifiedByDefault(true)需要设置为true以调用上面创build的SearchView.OnCloseListener()上的onClose()方法。

Android中没有任何控制台可以login。 相反,使用android日志框架:

 Log.d("Test Tag", "Testing. 1, 2, 3..."); 

另请参阅此问题: 为什么“System.out.println”在Android中不起作用?

有两种常见的SearchView.setOnCloseListener()模式。 这对所有的听众来说都是真的,但我正在专门解决你的问题。 第一种方法是创build一个监听函数并将其附加到成员variables中,第二种方法是使类实现接口并使处理函数成为函数。

创build一个监听器对象如下所示:

 private SearchView mSearchView; private final SearchView.OnCloseListener mOnCloseListener = new SearchView.OnCloseListener() { public boolean onClose() { doStuff(); return myBooleanResult; } }; mSearchView.setOnCloseListener(mOnCloseListener); 

在类级别实现监听器如下所示:

 public class MyClass implements OnCloseListener { private SearchView mSearchView; public MyClass(...) { mSearchView.setOnCloseListener(this); } @Override public boolean onClose() { doStuff(); return false; } } 

我还没有看到任何创buildOnCloseListener临时的例子,就像你在你的问题中所做的那样。