我正在尝试在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
我查看了the documentation和样本,但似乎没有任何改变。我在冰淇淋三明治上的Asus Transformer Prime和Galaxy Nexus上运行它。有什么想法吗?
更新
是 - 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
答案 0 :(得分:136)
我也遇到了这个问题,我别无选择,只能放弃“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;
}
答案 1 :(得分:60)
对于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
答案 2 :(得分:27)
对于这个问题,我想出了类似的东西,
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);
}
答案 3 :(得分:18)
我在android 4.1.1上遇到了同样的问题。看起来这是一个已知的错误:https://code.google.com/p/android/issues/detail?id=25758
无论如何,作为一种解决方法,我使用状态更改侦听器(当SearchView与操作栏分离时,它也明显关闭)。
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
答案 4 :(得分:8)
我最终使用了一些黑客,这对我的目的很有效 - 不确定它是否适用于所有目的。无论如何,我正在检查搜索查询是否为空。这与SearchView
的{{1}}实际上没有关系 - 但仍然不起作用!
OnCloseListener
答案 5 :(得分:6)
嗯,这解决了我的问题:
带有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;
}
});
答案 6 :(得分:2)
我遇到了onCloseListener没有调用SearchView的同样问题。 从25758中提出的bug问题以及我读过的一些帖子中了解到调用onCloseListener,你需要设置:
searchView.setIconifiedByDefault(true);
但对于我的情况,我想打开搜索视图&amp;没有图标化。我设法通过在下面添加一行来解决这个问题:
@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打开,尽管在上一行中将默认值设置为true。通过这种方式,我设法同时拥有一个SearchView 一直开放的&amp;让它调用onCloseListener。
答案 7 :(得分:2)
为了使OnCloseListener
有效,请确保在搜索菜单项中将showAsAction
设置为always
。
<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>
答案 8 :(得分:1)
对于MenuItemCompat
问题,我添加了ViewTreeObserver来跟踪可见性状态。你可以在这里查看我的答案:
https://stackoverflow.com/a/28762632/1633609
答案 9 :(得分:1)
创建菜单项,app:showAsAction
设置为always。
<item
android:id="@+id/action_search"
android:title="..."
android:icon="..."
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
在SearchView
方法中创建onCreateOptionsMenu
时,请执行类似操作
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
才能在上面创建的onClose()
上调用SearchView.OnCloseListener()
方法。
答案 10 :(得分:0)
似乎已经是一个旧线程,但我认为我在第一个开始时遇到了同样的问题API 18。在谷歌搜索后,找到了这个帖子,另一个小时读了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;
}
我玩了一下真/假,不知何故有所不同,现在它对我有用。希望它可以节省一些时间。
答案 11 :(得分:0)
未调用OnCloseListener
的原因是因为Android代码中存在错误 - 只有在您调用setIconifiedByDefault(true)
时才会调用侦听器。
答案 12 :(得分:0)
这是一种解决方法,但对我有用
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;
}
}
答案 13 :(得分:0)
var momentBusinessDays = require("moment-business-days")
momentBusinessDays('20-09-2018', 'DD-MM-YYYY').businessAdd(3)._d
如果您单击关闭searchView->
D /点击:关闭点击
答案 14 :(得分:0)
我在尝试检测SearchView的显示/关闭时遇到了此问题。我最终使用了另一个监听器,它可以满足我的需求:
setOnQueryTextFocusChangeListener { _, hasFocus ->
if (hasFocus) {
// SearchView is being shown
} else {
// SearchView was dismissed
}
}
答案 15 :(得分:0)
我使用了SearchView关闭按钮,并在其上设置了setOnClickListener
searchView.findViewById<ImageView>(R.id.search_close_btn).setOnClickListener {
searchView.setQuery("", false)
searchView.clearFocus()
}
答案 16 :(得分:-2)
Android中没有可登录的控制台。相反,使用android日志框架:
Log.d("Test Tag", "Testing. 1, 2, 3...");
答案 17 :(得分:-3)
SearchView.setOnCloseListener()
有两种常见模式。这对所有听众来说都是如此,但我正在专门解决你的问题。第一种方法是创建一个监听器函数并将其附加到一个成员变量,第二种方法是使类实现接口并使处理程序成为成员函数。
创建一个侦听器对象如下所示:
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;
}
}
我没有看到任何创建OnCloseListener
ad-hoc的示例,就像您在问题中所做的那样。