Я пытаюсь добавить поддержку SearchView
в ActionBar Android 3.0+, но не могу заставить 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 ничего не печатается. Вот логарифм, когда я нажимаю кнопку «Закрыть»:
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
showAsAction
установлен наalways
. Поле поиска имеет собственную кнопку закрытия , но если она установлена,ifRoom | collapseActionView
она расширяется на панели действий.Ответы:
Я тоже сталкиваюсь с этой проблемой, и у меня нет другого выбора, кроме как отказаться от "oncloselistener". Вместо этого вы можете получить свой menuItem
setOnActionExpandListener
. Затем переопределите нереализованные методы.источник
if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);
Для Android API 14+ (ICS и выше) используйте этот код:
Чтобы получить больше информации: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView.
Ссылка: onActionCollapse / onActionExpand
источник
Для этой проблемы я придумал что-то вроде этого:
источник
Я столкнулся с такой же проблемой на android 4.1.1. Похоже, это известная ошибка: https://code.google.com/p/android/issues/detail?id=25758
В любом случае, в качестве обходного пути я использовал прослушиватель изменения состояния (когда SearchView отсоединяется от панели действий, он, очевидно, также закрывается).
Приведенный выше код хорошо работал в моем случае.
Я публикую здесь тот же ответ: https://stackoverflow.com/a/24573266/2162924
источник
В итоге я использовал небольшой прием, который хорошо подходит для моих целей - не уверен, что он будет работать со всеми целями. В любом случае, я проверяю, пуст ли поисковый запрос. Это не совсем связано с
SearchView
"s"OnCloseListener
- все равно не работает!источник
Что ж, это решило мою проблему:
Пункт меню с
showAsAction="always"
и в деятельности
источник
always
значенияshowAsAction
атрибута решает проблему. Важно то, что, когдаalways
значениеis not
присутствует вshowAsAction
, раскрытыйSearchView
представляет кнопку закрытия (крестик) только в том случае, если запрос в строке неSearchView
равен нулю. То,SearchView.onCloseClicked
что обрабатывает события кнопки закрытия, сообщает, что обратный вызовOnCloseListener
вызывается только в том случае, если запрос пуст, если это не так - сначала он очищается - но затем, после очистки запроса, кнопка закрытия исчезает, и мы не можем доставитьonClose
обратный вызов наOnCloseListener
Для того , чтобы сделать
OnCloseListener
работу, убедитесь , чтоshowAsAction
установлен вalways
в пункте меню поиска.источник
Я столкнулся с той же проблемой, когда onCloseListener не вызывает SearchView. Изучив проблему с ошибкой , возникшую в 25758 , и некоторые сообщения, которые я читал, для вызова onCloseListener вам необходимо установить:
Но в моем случае я хотел, чтобы окно поиска открывалось, а не значковалось все время. Мне удалось решить эту проблему, добавив еще одну строку ниже:
SearchView.setIconified (false) приведет к открытию searchView, несмотря на то, что в предыдущей строке для значения по умолчанию установлено значение true. Таким образом, мне удалось получить как SearchView, который постоянно открывается, так и вызывать onCloseListener.
источник
Создайте пункт меню со
app:showAsAction
значением всегда.При создании
SearchView
вonCreateOptionsMenu
методе сделайте что-то подобноеВ
search.setIconifiedByDefault(true)
необходимо установить дляtrue
вызватьonClose()
метод наSearchView.OnCloseListener()
созданный выше.источник
Для
MenuItemCompat
проблемы я добавил ViewTreeObserver для отслеживания состояния видимости. Вы можете проверить мой ответ здесь: https://stackoverflow.com/a/28762632/1633609источник
Причина, по
OnCloseListener
которой не вызывается, заключается в том, что в коде Android есть ошибка - слушатель вызывается только в том случае, если вы также вызываетеsetIconifiedByDefault(true)
.источник
Кажется, это уже старый поток, но я думал, что у меня та же проблема API 18 вначале. После того, как погуглил, нашел эту ветку, еще час прочитал javadoc, попробовал и ошибся для чего-то, что я не претендую полностью понять в javadoc, теперь для меня работает следующая работа:
Я немного поигрался с истиной / ложью, это каким-то образом имеет значение, и теперь это работает для меня. Надеюсь, это поможет кому-то сэкономить время.
источник
Это обходной путь, но у меня сработало
источник
если вы нажмете закрыть searchView ->
D / click: закрыть нажал
источник
Я столкнулся с этой проблемой при попытке обнаружить отображение / закрытие SearchView. В итоге я использовал другой слушатель, и он работал для того, что мне нужно:
источник
Я использовал кнопку закрытия SearchView и установил на ней setOnClickListener
источник
В Android нет консоли для входа. Вместо этого используйте платформу ведения журнала Android:
См. Также этот вопрос: Почему "System.out.println" не работает в Android?
источник
Есть два общих шаблона для
SearchView.setOnCloseListener()
. Это действительно верно для всех слушателей, но я обращаюсь к вашему вопросу конкретно. Первый способ - создать функцию прослушивателя и присоединить ее к переменной-члену, а второй - заставить класс реализовать интерфейс и сделать обработчик функцией-членом.Создание объекта слушателя выглядит так:
Реализация слушателя на уровне класса выглядит так:
Я не видел примеров, которые бы создавали
OnCloseListener
ad-hoc, как вы в своем вопросе.источник