SearchView.OnCloseListener 没有被调用
Posted
技术标签:
【中文标题】SearchView.OnCloseListener 没有被调用【英文标题】:SearchView.OnCloseListener does not get invoked 【发布时间】:2012-12-04 22:48:24 【问题描述】:我正在使用操作栏并向其添加 searchView。我已经实现了 searchView.onCLoseListener 但这似乎没有被调用。有什么建议吗?
我的代码看起来像这样:
SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener()
public boolean onClose()
searchView.setVisibility(SearchView.GONE);
// Do Something
return true;
);
【问题讨论】:
【参考方案1】:我在 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
);
以上代码在我的情况下运行良好。
【讨论】:
不错的方法。工作 有了这个答案,你说“你现在安全了,我亲爱的孩子”,我在这里告诉你:“我欠你一条命”。合法,这个答案很好用。没有控制 SearchView 状态的合理选项,经过一天的搜索,我找到了这个并尝试了它——它只是。作品。在此发布四年后,它仍然非常相关。绝对应该是公认的答案! 我想补充一点,它只对我有用,当我写的时候......(new View.OnAttachStateChangeListener()......花了我一段时间,我希望我能节省你的时间 6 年过去了,这仍然是最好的答案。 Google 尚未解决此问题。【参考方案2】:为了从 SearchView.OnCloseListener 调用 onClose() 方法。我使它以下列方式工作。 将此添加到您的搜索视图
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);
);
这对我有用。分享,以便它也可以帮助其他人。 谢谢
【讨论】:
【参考方案3】:好的。我弄错了。我们不能添加一个 searchCommand 并做
setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)
这样做会删除 searchText(如果有的话),因此我们不能执行 onClose()。
【讨论】:
【参考方案4】:为了在单击“x”图标时收到通知,我在 SearchView 的“x”按钮上添加了一个单击监听器。
通过 id 找到 SearchView 'x' 按钮并附加 OnClickListener:
mSearchView.findViewById(R.id.search_close_btn)
.setOnClickListener(this);
视图 search_close_btn 存在于 Android 框架提供的 SearchView 布局中。
【讨论】:
【参考方案5】: 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);
更多信息来自这里:https://developer.android.com/training/appbar/action-views.html
【讨论】:
这可以从一些额外的解释中受益。【参考方案6】:我为解决类似问题所做的是创建了一个扩展 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>
然后你可以在你的活动中添加一个监听器:
getMenuInflater().inflate(R.menu.dictionary, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
EnglishVerbSearchView searchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(searchItem);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
// Assumes current activity is the searchable activity
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
searchView.setOnSearchViewCollapsedEventListener(listener);
您还可以覆盖类中替代 SearchView 的其他方法以实现其他目标。
【讨论】:
我在这里遇到了类似的问题:***.com/questions/43702055/…。关于如何解决的任何想法或想法?【参考方案7】:创建将app:showAsAction
设置为always 的菜单项。
<item
android:id="@+id/action_search"
android:title="..."
android:icon="..."
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
在onCreateOptionsMenu
方法中创建SearchView
时,请执行以下操作
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
,才能在上面创建的SearchView.OnCloseListener()
上调用onClose()
方法。
【讨论】:
【参考方案8】:我也发现了这个问题。解决方法很简单!只需将您的 SearchView
视图存储在私有变量中。然后使用
isShown
检查视图是否展开的方法,
searchview.addOnLayoutChange
确定 searchview
在 if 阻止后开始使用 isShown
,
使用 if block(searchView !=null && searchView.isShown()
覆盖 onBackPressed
,然后在用户单击返回按钮时执行您的操作,
并用isShown
块覆盖onOptionsItemSelected
中的home(back)
按钮侦听器。
注意:在菜单项 xml 文件中删除 app:showAsAction collapseActionView 标志。
【讨论】:
【参考方案9】:如果你设置了
searchView.setIconifiedByDefault(false)
然后,您的 searchView 永远不会关闭,因为它始终处于展开模式。这就是你的 onClose() 没有被调用的原因。
【讨论】:
以上是关于SearchView.OnCloseListener 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章