SearchView.OnCloseListener не вызывается
Я использую панель действий и добавляю searchView к ней. Я реализовал searchView.onCLoseListener, но, похоже, это не вызывается. Какие-либо предложения?
Мой код выглядит примерно так:
SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener() {
public boolean onClose() {
searchView.setVisibility(SearchView.GONE);
// Do Something
return true;
}
});
8 ответов
Хорошо. я понял ошибку Мы не можем добавить searchCommand и сделать
setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)
Выполнение этого удалит searchText, если таковой имеется, и, следовательно, мы не можем сделать onClose().
Я столкнулся с той же проблемой на 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
}
});
Выше код работал хорошо в моем случае.
В порядке вызова метода onClose() из SearchView.OnCloseListener. Я заставил это работать следующим образом. Добавьте это к вашему поисковому запросу
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);
}
});
Это сработало для меня. Поделиться, чтобы это могло помочь кому-то еще. Спасибо
Чтобы получать уведомления при нажатии значка "x", я добавил прослушиватель при нажатии кнопки "x" в SearchView.
Найдите кнопку SearchView "x" по идентификатору и прикрепите OnClickListener:
mSearchView.findViewById(R.id.search_close_btn)
.setOnClickListener(this);
Представление search_close_btn присутствует в макете SearchView, предоставляемом платформой Android.
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
Чтобы разобраться с подобной проблемой, я создал новый класс, который расширил 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;
}
}
Затем вы можете использовать этот класс вместо SearchView в вашем XML-файле меню:
<?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 для достижения других целей.
Я тоже нахожу эту проблему. решение очень простое! Просто сохраните свойSearchView
посмотреть в приват вар. Затем используйте
isShown
метод проверки, было ли развернуто представление,searchview.addOnLayoutChange
определитьsearchview
начать использоватьisShown
после блока if выполните свои действия,- отменять
onBackPressed
с еслиblock(searchView !=null && searchView.isShown()
затем выполняйте свои действия, когда пользователь нажимает кнопку "Назад", - и переопределить
home(back)
слушатель кнопки вonOptionsItemSelected
с участиемisShown
блок. Примечание: в пункте меню xml файл удалите флаг app:showAsAction collapseActionView.
Создайте пункт меню с app:showAsAction
установить всегда.
<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()
создано выше.
Если вы установили
searchView.setIconifiedByDefault(false)
тогда ваш searchView никогда не закрывается, как всегда в расширенном режиме. Это причина, по которой ваш onClose() не вызывается.