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;
}
搜索效果很好,除了 OnCloseListener
之外,所有功能都正常。没有任何内容被打印到 Logcat。这是当我按下“关闭”按钮时的 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
我查看了 文档 和示例,但似乎没有什么可以改变它。我在 Asus Transformer Prime 和 Galaxy Nexus 上运行它,两者都在 Ice Cream Sandwich 上。有什么想法吗?
更新:
是的 - System.out.println()
确实有效。证据如下:
@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
I'm trying to add support for the SearchView
in the Android 3.0+ ActionBar, but I can't get the OnCloseListener
to work.
Here's my code:
@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;
}
The search works great and every is working except for the OnCloseListener
. Nothing is being printed to Logcat. Here's the Logcat for when I'm pressing the "Close" button:
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
I've looked through the documentation and samples, but nothing seemed to change it. I'm running it on a Asus Transformer Prime and a Galaxy Nexus, both on Ice Cream Sandwich. Any ideas?
Update:
Yes - System.out.println()
does work. Here's proof:
@Override
public boolean onQueryTextChange(String newText) {
System.out.println(newText + "hello");
searchLibrary(newText);
return false;
}
Results in this 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
我也遇到这个问题,无奈只能放弃“oncloselistener”。相反,您可以获取 menuItem,然后获取 setOnActionExpandListener。然后重写未实现的方法。
I also meet this problem, and I have no choice but give up "oncloselistener". Instead, you can get your menuItem, then
setOnActionExpandListener
. Then override unimplents methods.对于 Android API 14+(ICS 及更高版本),请使用以下代码:
有关更多信息:http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
参考:onActionCollapse/onActionExpand
For Android API 14+ (ICS and greater) use this code:
For more information: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Ref: onActionCollapse/onActionExpand
对于这个问题我想出了这样的办法,
For this problem I came up with something like this,
我在 android 4.1.1 上遇到了同样的问题。看起来这是一个已知错误:https://code.google.com /p/android/issues/detail?id=25758
无论如何,作为一种解决方法,我使用了状态更改侦听器(当 SearchView 与操作栏分离时,它显然也被关闭)。
上面的代码在我的例子中效果很好。
我在这里发布相同的答案:https://stackoverflow.com/a/24573266/2162924
I ran into same problem on android 4.1.1. Looks like it is a known bug: https://code.google.com/p/android/issues/detail?id=25758
Anyway, as a workaround i used state change listener (when SearchView is detached from action bar, it is also closed obviously).
Above code worked well in my case.
I post same answer here: https://stackoverflow.com/a/24573266/2162924
我最终使用了一些 hack,这对我的目的来说很有效 - 不确定它是否适用于所有目的。不管怎样,我正在检查搜索查询是否为空。但这与
SearchView
的OnCloseListener
并没有真正的关系 - 但这仍然不起作用!I ended up using a bit of a hack, that works well for my purpose - not sure it'll work with all purposes. Anyway, I'm doing a check to see if the search query is empty. This is not really related to the
SearchView
'sOnCloseListener
though - that still doesn't work!好吧,这解决了我的问题:
带有
showAsAction="always"
的菜单项并处于活动状态
Well, this solved my problem:
Menu item with
showAsAction="always"
and in activity
为了使
OnCloseListener
正常工作,请确保在搜索菜单项中将showAsAction
设置为always
。In order to make the
OnCloseListener
work, make sure thatshowAsAction
is set toalways
in the search menu item.创建菜单项,并将
app:showAsAction
设置为always。在
onCreateOptionsMenu
方法中创建SearchView
时,执行类似的操作search.setIconifiedByDefault(true)
需要设置为true 调用上面创建的
SearchView.OnCloseListener()
上的onClose()
方法。Create the menu item with the
app:showAsAction
set to always.When creating the
SearchView
in theonCreateOptionsMenu
method do something similarThe
search.setIconifiedByDefault(true)
needs to be set totrue
to call theonClose()
method on theSearchView.OnCloseListener()
created above.如果您点击关闭 searchView ->
D/单击:关闭单击
if you click on close searchView ->
D/click: close clicked
我遇到了同样的问题,onCloseListener 没有调用 SearchView。
从25758中提出的错误问题以及我的一些帖子中了解已读过,要调用 onCloseListener,您需要设置:
但对于我的情况,我想打开搜索视图&并非一直图标化。我设法通过在下面添加一行来解决此问题:
尽管在上一行中将默认值设置为 iconified,但 searchView.setIconified(false) 将导致 searchView 打开。通过这种方式,我设法拥有了 SearchView
一直打开&让它调用 onCloseListener。
I have encountered the same problem with onCloseListener not invoking for the SearchView.
Understand from the bug issue raised in 25758, and some postings I have read, to invoke onCloseListener, you need to set:
But for my case I wanted to have the search view opened & not iconified all the time. I manage to resolve this by adding one more line below:
The searchView.setIconified(false) will cause the searchView to open up, despite setting the default to iconified to true in the previous line. In this way, I managed to have both a SearchView
that opens up all the time & having it invoke the onCloseListener.
对于
MenuItemCompat
问题,我添加了 ViewTreeObserver 来跟踪可见性状态。你可以在这里查看我的回答:https://stackoverflow.com/a/28762632/1633609
For
MenuItemCompat
problem I added ViewTreeObserver to track the visibility state. You can check my answer here:https://stackoverflow.com/a/28762632/1633609
我使用了 SearchView 关闭按钮并在其上设置了 setOnClickListener
I used the SearchView close button and set a setOnClickListener on it
未调用
OnCloseListener
的原因是 Android 代码中存在一个错误 - 仅当您还调用setIconifiedByDefault(true)
时才会调用侦听器。The reason the
OnCloseListener
is not called is because there is a bug in the Android code -- the listener is only called if you also callsetIconifiedByDefault(true)
.似乎已经是一个旧线程了,但我想我一开始就遇到了同样的问题 API 18。在谷歌搜索后,找到了这个线程,又花了一个小时阅读了javadoc,尝试并错误地发现了我在javadoc中没有假装完全理解的东西,现在对我来说以下工作:
我玩了一下真/假,这在某种程度上产生了差异,现在它对我有用。希望它可以节省某人的时间。
seems an old thread already, but I thought I got the same problem API 18 in the first beginning. After googled around, found this thread, another hour read the javadoc tried and errored for something I don't pretend fully understand in javadoc, the following work for me now:
I played with true/false a bit, that somehow makes the difference, and it works for me now. Hopefully, it could save someone time.
这是一种解决方法,但对我有用
It's a workaround but has worked for me
我在尝试检测 SearchView 的显示/关闭时遇到了这个问题。我最终使用了不同的监听器,它满足了我的需要:
I encountered this issue while trying to detect the showing/dismissal of the SearchView. I ended up using a different listener and it worked for what I need:
Android 中没有可登录的控制台。相反,使用 android 日志框架:
另请参阅这个问题:为什么不' “System.out.println”在 Android 中工作吗?
There is no console in Android to log to. Instead, use the android logging framework:
See also this question: Why doesn't "System.out.println" work in Android?
SearchView.setOnCloseListener()
有两种常见模式。这对所有听众来说都是如此,但我是在专门回答你的问题。第一种方法是创建侦听器函数并将其附加到成员变量,第二种方法是使类实现接口并将处理程序作为成员函数。创建侦听器对象如下所示:
在类级别实现侦听器如下所示:
我没有看到任何创建
OnCloseListener
ad-hoc 的示例,就像您在问题中所做的那样。There are two common patterns for
SearchView.setOnCloseListener()
. This is really true of all listeners, but I'm addressing your question specifically. The first way is to create a listener function and attach it to a member variable, and the second is to make the class implement the interface and have the handler be a member function.Creating a listener object looks like this:
Implementing listener at class level looks like this:
I have not seen any examples that create the
OnCloseListener
ad-hoc, as you did in your question.