- Русские Блоги
- Использование SearchView в Android
- Очки знаний в этой статье
- 1. Введение в SearchView
- 2. Функция поиска NetEase Cloud Music
- 2.1 Базовая реализация функции поиска
- 2.1.1 Инициализация и мониторинг кнопки поиска
- 2.2 Украшение интерфейса
- 2.2.1 Текст приглашения по умолчанию
- 2.2.2 Кнопка поиска не исчезает
- 2.2.3 Кнопка поиска, чтобы отменить проблему закрытия значка
- 2.2.4 Расширение панели поиска по умолчанию
- 2.2.5 Изменить значок поиска или удалить значок
- 2.2.6 Изменить цвет текста
- Android SearchView.OnQueryTextListener OnQueryTextSubmit не запускается в пустой строке запроса
- Отложить вызов onQueryTextChange () в SearchView.OnQueryTextListener с помощью SearchView
- 5 ответов
- Реализация мгновенного поиска в Android с помощью RxJava
- Мгновенный поиск
- Реактивное программирование
- Заключение
Русские Блоги
Использование SearchView в Android
Уважаемые одноклассники, я снова здесь и готов к вождению. , ,
Я не знаю, что вы обычно используете для прослушивания музыки, мне лично нравится NetEase Cloud Music (Не реклама, но что я делаю?), но теперь NetEase Cloud Music не может остановить песню Джея Чоу, это немного. , , В тот день я неожиданно подумал о MaterialDesign, который я недавно изучал, и о том, как реализована строка заголовка NetEase Cloud Music. Позже я использовал различные Baidus, и мои усилия окупились. Я наконец-то понял это! На самом деле, NetEase Cloud Music использует SearchView, упомянутый в заголовке, который фактически является поисковым. Так как это достигается? Пожалуйста, послушайте разложение в следующий раз!
[Загрузка изображений за пределы сайта . (image-41ace8-1524489658384)]
Шучу, студенты готовы и сразу поехали. , ,
Очки знаний в этой статье
- Введение в SearchView
- Реализуйте функцию поиска в NetEase Cloud Music
- Реализация базовой функции поиска
- Украшение страницы
- Некоторые общие проблемы
Позвольте мне кратко объяснить, здесь в основном объясняется, как SearchView реализует строку заголовка NetEase Cloud Music, но все они основаны на Панели инструментов, если вы мало знаете о Панели инструментов и меню!
Пожалуйста, смотрите эти две статьи на моем публичном аккаунте (сильная волна выхода)
Выше подробно объяснено использование и меры предосторожности панели инструментов и меню! ! !
1. Введение в SearchView
SearchView — это элемент управления поиском, который связан с панелью инструментов и задается через меню (я не знаю, можете ли вы понять, как я его обобщил). Кнопка поиска появится в правой части панели инструментов (система поставляется с ней, вы также можете заменить ее). Когда вы нажмете кнопку поиска, появится соответствующее окно редактирования для поиска. При нажатии на крестик этот поиск отменяется, а кнопка поиска восстанавливается.
2. Функция поиска NetEase Cloud Music
2.1 Базовая реализация функции поиска
Вот некоторые изменения в меню, поэтому оно может не совпадать с вашим базовым эффектом, но я опубликую соответствующий контент, чтобы оно было удобно для ленивых больных раком, таких как я, и могло быстро достичь эффекта. В конце концов, когда проект разработки плотный, мне все равно, как его достичь! ! ! Сначала посмотрите на рендеринг основных функций
[Загрузка изображений за пределы сайта . (image-35b1ae-1524489658384)]
Я считаю, что если вы прочтете две предыдущие статьи, вы скоро сможете написать строку заголовка ниже.
- Код файла меню
- Код файла макета
- Код в деятельности
Запустите приведенный выше код, и тогда вы сможете увидеть вышеуказанный контент!
2.1.1 Инициализация и мониторинг кнопки поиска
Потому что, когда вы инициализируете SearcheView, вам нужно работать с соответствующим меню, поэтому оно обычно будет в onCreateOptionsMenu(Menu menu) Получить его в. Конкретный код выглядит следующим образом:
Обратите внимание, что это также может быть использовано при инициализации SearchView MenuItemCompat.getActionView(searchItem); Приобретение только устарело. , , Так что не говорите, что не знаете, видите ли вы это
- Соответствующий монитор setOnQueryTextListener(OnQueryTextListener listener)
Может ли вышеуказанный контент реализовать простой поиск? На самом деле я лично считаю, что этого мало? Почему ты это сказал? Поскольку вы хотите контролировать переключение фрагментов, нет соответствующей временной точки или нет времени для переключения фрагментов. Я долго думал об этом. Позже, когда я увидел исходный код, я обнаружил, что время проекта Google на самом деле Я уже думал об этом для нас. На самом деле, я думаю, что мы можем думать, инженеры Google поймут это для нас!
- setOnSearchClickListener (OnClickListener listener) Метод для обратного вызова при нажатии значка поиска.
- setOnCloseListener (OnCloseListener listener) Метод для обратного вызова при переходе после поиска.
Таким образом, есть соответствующий момент времени. Когда вы входите, открываете вещь и вставляете фрагмент (здесь, если вы хотите добавить эффекты анимации, вы можете использовать ViewPager, а затем переключиться, установив метод для отображения этого. На самом деле, вещи тоже Вы можете установить анимацию, это зависит от того, как вы выберете). Когда вы нажимаете закрыть. Просто замените предыдущий фрагмент. Чтобы все лучше поняли, позвольте мне реализовать это в коде! Давайте посмотрим на эффект (виртуальная машина немного глупа!)
- На самом деле никаких изменений в xml нет, поэтому я не буду публиковать их!
- Код в Activity является наиболее важным, код выглядит следующим образом:
Здесь важнее всего эти мониторы. Пока вы понимаете мониторы, в принципе проблем не будет.
Таким образом, соответствующий эффект может быть достигнут. как насчет этого? Не плохо, верно! ! !
2.2 Украшение интерфейса
2.2.1 Текст приглашения по умолчанию
Приведенное выше изображение отображается, когда текст подсказки отсутствует. Как добавить текст подсказки?
Вы можете добавить текст запроса поиска через вышеуказанный код.
2.2.2 Кнопка поиска не исчезает
Эта кнопка поиска находится внутри поля ввода.При настройке содержимого кнопка поиска исчезнет. Я чувствую, что то, что я описал, не правильно, что с ним? Пока ты понимаешь. , ,
- setIconifiedByDefault (boolean iconified) Этот Api в основном контролирует, находится ли кнопка поиска внутри поля ввода, true означает, что она отображается внутри, а false означает, что она отображается снаружи
2.2.3 Кнопка поиска, чтобы отменить проблему закрытия значка
У некоторых менеджеров по продукту всегда есть странные потребности и они хотят убрать крест после поиска. Скажи бесчеловечность. , , Может быть изменено только тихо. , , На самом деле, мое сердце разбито. , ,
- onActionViewExpanded () устанавливает API, чтобы значок закрытия не отображался
Хотя вы можете отключить этот значок, в этом случае есть проблема: операция отключения и переключения фрагмента, записанного ранее, будет здесь недействительной. Как это решить? Подумав об этом в течение долгого времени, мне нужно иметь дело только с событием возврата, или у меня нет возможности узнать, когда пользователь действительно, когда поиск завершен? Только тогда, когда будет выполнена операция возврата и когда она закончится!
Добавьте этот код, получите onDloseClicked () SearchView через отражение, просто вызовите его
2.2.4 Расширение панели поиска по умолчанию
Продукт снова сказал. Когда вы входите на эту страницу, диалоговое окно поиска должно отображаться по умолчанию. Пользователю требуется на одну операцию меньше и удобство работы. Я сказал в то время. Как насчет пользователя? Продукт говорит, что такой странный пользователь не заботится. , , (Я был в то время! Моя голова была полна черных линий)
- setIconified (boolean iconify) Установить, будет ли расширено поле ввода поиска, обратите внимание здесь! false означает расширенный, true означает закрытый
2.2.5 Изменить значок поиска или удалить значок
Продукты Laogen не собираются работать! Я посмотрел на значок поиска и подумал, что он маленький, я хочу изменить его! Как это сделать?
В теме Активность на странице, добавьте соответствующийsearchViewStyleСвойство, это свойство может быть установлено самостоятельно.
Изображение здесь зависит от вашей игры. , ,
2.2.6 Изменить цвет текста
Если вы считаете, что текст в поле ввода или текст приглашения выглядят чёрно-черными, вы можете изменить его следующим образом.
Я не знаю, есть ли что-нибудь еще. Я думаю, этого достаточно, чтобы иметь дело с вашими менеджерами по продукту. Вы не можете положить нож на стол или положить QR-код или что-то еще. , ,
Я надеюсь, что моя статья будет полезна для вас! Надеюсь, мы добьемся прогресса вместе. , , увидимся!
Источник
Android SearchView.OnQueryTextListener OnQueryTextSubmit не запускается в пустой строке запроса
Я использую Android 4.1.2. У меня есть виджет SearchView на ActionBar . Документация на SearchView.OnQueryTextListener с сайта разработчика Android указывает, что onQueryTextSubmit запускается, когда «Вызывается, когда пользователь отправляет запрос. Это может быть связано с нажатием клавиши на клавиатуре или из-за нажатия кнопки отправки».
Этого не происходит, если поисковый запрос пуст. Мне нужно, чтобы он запускал пустой запрос, чтобы очистить фильтр поиска ListView. Является ли это ошибкой или я делаю что-то неправильно?
Это не ошибка, исходный код намеренно проверяет пустые и пустые значения:
Однако вы должны иметь возможность использовать обратный вызов OnQueryTextChange, чтобы очистить фильтрующие элементы ListView, когда пользователь очистит поиск EditText.
У меня была такая же проблема, и в итоге SearchView следующее решение: пользовательский SearchView + OnQueryTextListener.onQueryTextChange
Создание действия и настройка обратного вызова:
И последний слушатель:
Протестировано на АБС 4.3.
У меня была такая же проблема с SearchView. Мое решение, которое состоит из стилей SearchView, как показано в руководстве http://novoda.com/blog/styling-the-actionbar-searchview/, и установки OnEditorActionListener для EditText ( как мне инициировать действие, когда пользователь нажал кнопку ввода? ), Который Является частью SearchView:
Ive проще работать: используйте onQueryTextChange, но только визуализируйте, если он пуст.
Как отмечали другие, это поведение преднамеренно. Я отказался от решения для OnQueryChangeListener и решил обходным путем путем внедрения OnEditorActionListener в EditText в SearchView, в котором вы можете получить дескриптор использования R.id.search_src_text . Пока вы setImeOptions из SearchView в EditorInfo.IME_ACTION_SEARCH вы можете обрабатывать щелчок по кнопке поиска на клавиатуре. См. Этот ответ SO для получения более подробной информации.
У меня была та же проблема, поскольку пустой запрос не поддерживается. Мне пришлось загрузить и использовать ActionBarSherlock, а затем изменить метод onSubmitQuery ().
Вот как выглядит мой onSubmitQuery ()
Надеюсь это поможет.
Вы не можете перезаписать это поведение. Обходной путь может заключаться в очистке фильтра, когда пользователь выходит из поиска.
Вы можете использовать OnCloseListener для этого. Однако это может также вызвать проблемы, в зависимости от минимального уровня API, для которого вы разрабатываете.
Другой вариант – запустить метод onQueryTextChange вручную через TextWatcher:
Все это идет со всеми файлами xml по умолчанию, которые были отброшены здесь, и это не является точкой ответа. Это обходной путь, который я предпочитаю использовать, не стесняйтесь использовать другие
Я могу сделать это просто, выполнив setOnQueryTextListener таким образом:
Где мой метод loadLocalData
Это решение очищает ваш запрос, даже если вы очищаете текст с помощью кнопки «X»
Это очень грязный взломать , однако он работает правильно, как и ожидалось, что позволяет отправить действие, даже если в SearchView не введен текст (или введенный затем отредактирован).
Он рефлексивно получает доступ к внутреннему редактору действий редактора TextView, обертывает его в пользовательский прослушиватель, где он делегирует вызов обработчику, и, наконец, устанавливает его как исполнитель действия внутреннего TextView.
Источник
Отложить вызов onQueryTextChange () в SearchView.OnQueryTextListener с помощью SearchView
Использование SearchView в моем приложении.
Есть ли способ отложить вызов метода onQueryTextChange ()? Например, когда пользователь вводит последовательность символов, он должен дождаться вызова этого метода.
Это ожидание должно не зависеть от количества набранных символов, но перед срабатыванием метода требуется небольшая пауза.
Я хочу сделать паузу, потому что, когда пользователь вводит в представление поиска, на сервер будет отправлен запрос со строкой для запроса сопоставленных данных, а затем я заполню свой ListView в соответствии с предложениями.
Информация о деятельности (если требуется):
Реализует SearchView.OnQueryTextListener .
5 ответов
Чтобы отложить вызов вашего сервера, используйте следующий код в своем методе onQueryTextChange, переменные mQueryString и mHandler должны быть переменными класса. также проверьте mHandler! = null
Отложить вызов onQueryTextChange () в SearchView.OnQueryTextListener с помощью SearchView
1) Создайте абстрактный класс:
2) Установите это так:
Вы можете использовать такие сопрограммы Kotlin. Объявить обратный отсчет
А затем onQueryTextChange:
Это должно помочь вам, ваш класс должен реализовать «SearchView.OnQueryTextListener», а «cntr» должен быть объявлен в вашем классе
Это уже помрачено для обычного набора текста пользователем, если вы хотите больше ждать, просто поднимите «waitTime».
Источник
Реализация мгновенного поиска в Android с помощью RxJava
Я работаю над новым приложением, которое, как это обычно и происходит, связывается с бэкенд-сервисом для получения данных через API. В этом примере я буду разрабатывать функцию поиска, одной из особенностей которого будет мгновенный поиск прямо во время ввода текста.
Мгновенный поиск
Ничего сложного, подумаете вы. Нужно просто разместить компонент поиска на странице (скорее всего, в тулбаре), подключить обработчик событий onTextChange и выполнить поиск. Итак, вот что я сделал:
Но вот в чём проблема. Поскольку мне необходимо реализовать поиск прямо во время ввода, то всякий раз, когда срабатывает обработчик события onQueryTextChange() , я обращаюсь к API для получения первого набора результатов. Логи выглядят следующим образом:
Несмотря на то, что я просто печатаю свой запрос, происходит пять вызовов API, каждый из которых выполняет поиск. Например, в облаке вам необходимо платить за каждое обращение к API. Таким образом, когда я ввожу свой запрос, мне нужна небольшая задержка перед его отправлением, чтобы в итоге состоялось только одно обращение к API.
Теперь, предположим, я хочу найти что-нибудь ещё. Я удаляю TEST и ввожу другие символы:
Происходит 20 вызовов API! Небольшая задержка сократит количество этих вызовов. Я также хочу избавиться от дубликатов, чтобы обрезанный текст не приводил к повторным запросам. Ещё я, вероятно, захочу отфильтровать некоторые элементы. Например, нужна ли возможность поиска без введённых символов или поиска по одному символу?
Реактивное программирование
Есть несколько вариантов дальнейших действий, но прямо сейчас я хочу сосредоточиться на технике, которая широко известна как реактивное программирование и библиотека RxJava. Когда я впервые столкнулся с реактивным программированием, то увидел следующее описание:
ReactiveX — это API, который работает с асинхронными структурами и манипулирует потоками данных или событиями, используя сочетания паттернов Observer и Iterator, а также особенности функционального программирования.
Это определение не полностью объясняет сущность и сильные стороны ReactiveX. А если и объясняет, то только тем, кто уже знаком с принципами работы этого фреймворка. Я также видел такие диаграммы:
Диаграмма объясняет роль оператора, но не позволяет полностью разобраться в сути. Итак, давайте посмотрим, смогу ли я понятнее объяснить данную диаграмму на простом примере.
Давайте сначала подготовим наш проект. Вам понадобится новая библиотека в файле build.gradle вашего приложения:
Не забудьте синхронизировать зависимости проекта, чтобы загрузить библиотеку.
Теперь давайте рассмотрим новое решение. Используя старый метод, я обращался к API при вводе каждого нового символа. C помощью нового способа я собираюсь создать Observable :
Этот код выполняет абсолютно то же самое, что и старый код. Логи выглядят следующим образом:
Тем не менее, ключевое отличие использования нового приёма заключается в наличии реактивного потока — Observable . Обработчик текста (или обработчик запроса в данном случае) отправляет элементы в поток, используя метод onNext() . А у Observable есть подписчики, которые и обрабатывают эти элементы.
Мы можем создать цепочку методов перед подпиской, чтобы уменьшить список строк для обработки. Начнём с того, что отправленный текст всегда будет находиться в нижнем регистре и в нём не будет пробелов в начале и конце строки:
Я сократил методы, чтобы показать наиболее значимую часть. Теперь те же логи выглядит следующим образом:
Теперь давайте применим задержку на 250мс, ожидая большего количества контента:
И, наконец, удалим дубликаты потока, чтобы только первый уникальный запрос был обработан. Последующие идентичные запросы будут игнорироваться:
Прим. перев. В данном случае разумнее использовать оператор distinctUntilChanged() , потому что иначе в случае повторного поиска по какой-либо строке запрос просто проигнорируется. А при реализации такого поиска разумно обращать внимание только на последний успешный запрос и игнорировать новый в случае его идентичности с предыдущим.
В конце отфильтруем пустые запросы:
На этом этапе вы заметите, что выводится только одно (или, может быть, два) сообщение в логах, что говорит о меньшем количестве вызовов API. При этом приложение будет продолжать адекватно работать. Более того, случаи, когда вы вводите что-либо, но затем удаляете и вводите снова, также приведут к меньшему количеству обращений к API.
Существует ещё много различных операторов, которые вы можете добавить в этот пайплайн в зависимости от ваших целей. Я считаю, что они весьма полезны для работы с полями ввода, которые взаимодействуют с API. Полный код выглядит следующим образом:
Теперь я могу заменить сообщение логов обращением ко ViewModel, чтобы инициировать вызов API. Однако это уже тема для другой статьи.
Заключение
С помощью этой простой техники обёртывания текстовых элементов в Observable и использования RxJava вы можете сократить количество вызовов API, которые необходимы для выполнения операций с сервером, а также улучшить отзывчивость вашего приложения. В этой статье мы затронули лишь малую часть целого мира RxJava, поэтому я оставляю вам ссылки для дополнительного чтения на эту тему:
- Grokking RxJava от Дэна Лью (это сайт, который помог меня двигаться в правильном направлении).
- Сайт ReactiveX (я часто ссылаюсь на этот сайт при построении пайплайнов).
Источник