我正在使用操作栏并向其添加searchView。我已经实现了searchView.onCLoseListener,但似乎没有被调用。有什么建议吗?
我的代码看起来像这样:
SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener() {
public boolean onClose() {
searchView.setVisibility(SearchView.GONE);
// Do Something
return true;
}
});
答案 0 :(得分:22)
我在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
}
});
以上代码在我的案例中运作良好。
答案 1 :(得分:2)
确定。我弄错了。我们无法添加searchCommand并执行
setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)
执行此操作会删除searchText(如果有),因此我们无法执行onClose()。
答案 2 :(得分: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 :(得分:1)
我为解决类似问题所做的是创建了一个扩展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以实现其他目标的其他方法。
答案 4 :(得分:1)
要在点击“x”图标时收到通知,我在SearchView“x”按钮上添加了一个点击监听器。
按ID查找SearchView“x”按钮并附加OnClickListener:
mSearchView.findViewById(R.id.search_close_btn)
.setOnClickListener(this);
视图search_close_btn存在于Android框架提供的SearchView布局中。
答案 5 :(得分:1)
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 :(得分:0)
创建菜单项,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()
方法。
答案 7 :(得分:0)
我也发现了这个问题。解决方法很简单!只需将您的SearchView
视图存储在私有变量中即可。然后使用
isShown
方法来检查视图是否已扩展,searchview.addOnLayoutChange
确定searchview
是在if block进行操作后开始使用isShown
,onBackPressed
覆盖block(searchView !=null && searchView.isShown()
,然后在用户单击“后退”按钮时执行操作,home(back)
块覆盖onOptionsItemSelected
中的isShown
按钮侦听器。
注意:在菜单项xml文件中,删除app:showAsAction crashActionView标志。答案 8 :(得分:-1)
如果您已设置
searchView.setIconifiedByDefault(false)
然后,您的searchView永远不会关闭,因为它始终处于扩展模式。这就是为什么你的onClose()没有被调用的原因。