Multi autocomplete text android

AutoCompieteTextview и MultiAutoCompleteTextView

AutoCompleteTextView

Компонент AutoCompleteTextView — это текстовое поле с автозаполнением и возможностью редактирования вводимого текста. Использование компонента удобно в том случае, когда требуется ускорить процесс ввода текста.

На панели инструментов элемент можно найти в разделе Texts.

AutoCompleteTextView является подклассом EditText, поэтому доступны все возможности форматирования и редактирования текста родительского класса.

Дополнительно, у AutoCompleteTextView есть свойство completionThreshold для указания минимального числа символов, которое должен ввести пользователь, чтобы включилась функция автозаполнения. Для связывания с данными необходимо задействовать адаптер, содержащий список значений через метод setAdapter().

Для упрощения создадим статический массив строк с именами котов и свяжем его через адаптер с нашим элементом в Java-коде. В реальных приложениях лучше использовать строковые ресурсы.

Запустите пример и начинайте вводить имена. Если вы напечатаете два символа му, то появится выпадающий список с вариантами слов для продолжения. Дальше текст можно не набирать, а просто коснуться нужного варианта и готовый текст сразу вставится в текстовое поле. Вот так все просто и работает.

Пример с строковыми ресурсами (res/values/string.xml).

Получаем массив из ресурсов и используем в адаптере.

Пример для Kotlin

Напишем аналогичный пример на Kotlin и добавим несколько новых слушателей.

Стилизация

Подготовим тему в styles.xml:

Подключим тему к компоненту.

Место вывода выпадающего списка

По умолчанию выпадающий список подсказок выводится сразу под текстовым полем. Но можно переопределить это поведение через атрибут android:dropDownAnchor, указав нужный идентификатор компонента.

Добавим кнопку под текстовым полем и будем выводить выпадающий список под кнопкой.

Динамический подбор

В примере используется готовый набор слов для подстановки. Можно модифицировать программу, чтобы список слов был динамическим. Когда пользователь напечатает новое слово и нажмёт ОК, то проверяем наличие данного слова в массиве. Если такого слова нет, то добавляем в массив. Для решения данной задачи обычный строковый массив нам не подойдёт, будем использовать List .

Собственный адаптер для выпадающего списка подсказок

Можно настроить свой адаптер для вывода подсказок, используя интерфейсы Filterable и ListAdapter. Можно наследоваться от ArrayAdapter, который уже имеет эти интерфейсы.

Попробуйте реализовать пример самостоятельно и пришлите его мне.

MultiAutoCompleteTextView

На панели инструментов компонент можно найти в том же разделе Texts.

Использование компонента удобно в том случае, когда требуется ускорить процесс ввода текста.

MultiAutoCompleteTextView — это текстовое поле с автозаполнением и возможностью редактирования вводимого текста, расширяющее функциональность AutoCompieteTextview, который может показывать автозаполнение для каждой из подстрок текста, разделенных знаком пунктуации. Разделитель задается явно вызовом метода setTokenizer().

MultiAutoCompleteTextView является подклассом EditText и AutoCompleteTextView, поэтому доступны все возможности форматирования и редактирования текста родительских классов, описанных выше.

Пример практически не будет отличаться от предыдущего. Главная особенность — можно задать строковый массив в виде строк, разделенных запятой, например, так:

Теперь, при наборе первых букв, будет выводиться не одно слово, а сразу пара слов.

Библиотеки

EmailAutoCompleteTextView — данные берутся из списка контактов вашего телефона

Источник

Multi autocomplete text android

A library that provides a layer of abstraction over the Android MultiAutoCompleteTextView standard component, to simplify showing a drop down menu with suggestions for auto complete when the user is typing into an editable text view.

  • Built-in support for multiple data types in the same MultiAutoCompleteTextView
  • Built-in support for different token types: prefix handles (i.e. @johndoe) or comma-separated values
  • Built-in support for a simple image/text data type with standard layout
  • Fully customizable item layout management, view binders and view holders included
  • Fully customizable data filtering strategy and data sorting policies
  • Type-specific listeners to detect when a full token is added/removed from the text
  • High performance data indexing on a background thread to reduce filtering overhead
Читайте также:  Android sdk location error

Using MultiAutoComplete can be as easy as this:

Advantages over using MultiAutoCompleteTextView directly

  • No need to write your own Tokenizer implementation for handles
  • No need to write the drop down ListView adapter boilerplate code
  • No need to write a (thread-safe) Filter subclass for the adapter
  • No need to write an adapter composition pattern to support multiple types
  • No need to write decorator objects to merge different data types in a single adapter
  • Support for the hidden Android API Filter$Delayer through reflection (new in 0.2.5)
  • (coming soon) Ability to easily swap between AutoCompleteTextView and MultiAutoCompleteTextView

Due to the announced shutdown of JCenter this library has been migrated to Maven Central repository. At the same time its Group ID has been changed from com.teamwork to com.teamwork.multiautocomplete .

Add dependency via Gradle: In your project’s build.gradle :

then in the module’s build.gradle :

or Maven:

Previous versions of the library can still be found on Bintray (complete shutdown is planned on February 2022).

Add dependency via Gradle (please note the different groupId ):

or Maven:

To understand how to use the library quickly, keep in mind the definition of those recurring words in the API:

Type adapter: Just like Android adapters (and the Adapter design pattern), a type adapter is used to display and filter a single data type (also called model). Each model requires a separate type adapter.

Token: A text token is a string that is processed by a filter and recognized as valid for triggering auto completion. A token can be prefixed by a char handle (i.e. @johndoe, where ‘@‘ is the handle) or can be a single word with a separator (i.e. a space, or a comma).

Constraint: a text constraint is similar to a token, but it’s used to filter contents from the type adapters. If the token has a handle, i.e. @johndoe, its constraint will be johndoe.

In order to customize MultiAutoComplete to suit your needs, you’re going to need to use or implement some or all of these interfaces:

  • MultiAutoComplete : The main library component, it manages the type adapters and holds a reference to the MultiAutoCompleteTextView . It provides lifecycle methods to attach/detach the view itself. It holds an «adapter of adapters» internally, with which the presenter can handle multiple data types in the same instance and decide which adapter to use for filtering depending on what kind of token is being typed in.

To create an instance use one of the static factory methods in MultiAutoComplete.Builder or, for full customization, use the Builder itself:

  • AutoCompleteTypeAdapter : A typed adapter, used to provide a layout, data binding and filter options for a single data type. It holds a ViewBinder and a TokenFilter.

To create an instance use the static factory method AutoCompleteTypeAdapter.Build.from() :

To set (or replace) the items for the type adapter, even after MultiAutoComplete was created, just call:

Читайте также:  Scrollview android studio kotlin

AutoCompleteViewBinder : A typed component used by a type adapter to bind the data from an item to the appropriate layout. SimpleItemViewBinder is a concrete implementation provided for the SimpleItem data type.

TokenFilter : A typed component used by a type adapter that takes care of the filtering strategy for the adapter elements. It also determines whether the type adapter supports the text token that’s being currently typed in. Concrete implementations for basic usage are HandleTokenFilter , which support a single handle prefix (like ‘@‘), and SimpleTokenFilter , which just matches any token. Both filter items by matching the current text constraint with the value returned by the item’s toString() method.

Tokenizer : Defined by the MultiAutoCompleteTextView.Tokenizer interface (see javadoc), a tokenizer is used by a MultiAutoCompleteTextView to detect the beginning and ending of a token within a text sequence. Using PrefixTokenizer allows you to match all tokens with a handle which are supported by the type adapters you provide:

Alternatively, you can use the Android built-in MultiAutoCompleteTextView.CommaTokenizer (see javadoc) to detect comma-separated words or write your own Tokenizer for full customization of the token detection, including which characters and separators to support.

The module demo contains simple usage examples of MultiAutoComplete. Pull the source code and run the app to check it out.

About

A lightweight and powerful abstraction over MultiAutoCompleteTextView and Tokenizer

Источник

Android MultiAutocompleteTextView

Android Tutorial

In this tutorial, we’ll be discussing and implementing the MultiAutocompleteTextView widget in our application.

Android MultiAutoCompleteTextView

MultiAutoCompleteTextView extends AutoCompleteTextView. Unlike AutoCompleteTextView which shows the suggestion for only one string, a MultiAutoCompleteTextView shows you suggestions for each of the substrings you enter separated by a token.

This feature is fairly common in places such as specifying multiple tags(Ever came across that on StackOverflow or Github?). You must have used that when sending messages to multiple people too.

How is it implemented?

A Tokenizer instance is set on the MultiAutoCompleteTextView instance. By default in Android, we have a CommaTokenizer built-in class to separate the auto complete strings by commas. Once a string is selected from the dropdown, the comma is appended to mark the end of that substring.

The Tokenizer is set inside the method setTokenizer() .

Another important method: setThreshold() is used to specify the number of characters after which the dropdown with the autocomplete suggestions list would be displayed.

Let’s jump to the coding part.

Project Structure

The code for the activity_main.xml class is given below:

The first MultiAutoCompleteTextView could use a Comma Tokenizer. The second would use a custom one – Space Tokenizer.

The code for the SpaceTokenizer.java is given below:

The methods findTokenStart findTokenEnd and terminateToken are a part of the Tokenizer interface and are implemented.

The code for the MainActivity.java class is given below

The output of the above application in action is given below:

This brings an end to this tutorial. You can download the project source code from the link below.

Источник

Android AutoCompleteTextView с подсказками из веб-сервиса

Для одного из своих Android-приложений Book Tracker я реализовал кастомный AutoCompleteTextView с подсказками для названий книг, которые динамически подгружаются с Google Books по мере ввода названия книги.

Задача перед компонентом стояла следующая:

  • Загрузка данных должна осуществляться в отдельном потоке, чтобы не блокировать UI-поток;
  • Загрузка подсказок должна начинаться только, если пользователь приостанавливает набор (чтобы предотвратить отправку множества запросов к серверу после каждого введенного символа);
  • Подсказки должны загружаться, если пользователь ввел строку некоторой минимальной длины (нет смысла начинать загрузку данных для строки из двух или трех символов);
  • При запросе к серверу в правой части поля должен быть показан анимированный прогресс, чтобы информировать пользователя о загрузке.
Читайте также:  Custom toolbar android studio

Финальный результат:

Шаг 1 – реализация кастомного адаптера для AutoCompleteTextView

Адаптер для AutoCompleteTextView – это ключевой компонент, в котором происходит загрузка и хранение подсказок. BookAutoCompleteAdapter реализовывает интерфейс Filterable, чтобы перехватывать ввод пользователя из AutoCompleteTextView и передавать его в качестве поискового запроса в веб-сервис. Единственный метод интерфейса Filterable – это getFilter(), который должен возвращать экземпляр класса Filter, осуществляющий загрузку и публикацию данных. Наследники класса Filter должны реализовать два метода: performFiltering(CharSequence constraint) и publishResults(CharSequence constraint, Filter.FilterResults results).

Метод performFiltering будет вызван в отдельном потоке автоматически, поэтому нет необходимости создавать и запускать новый поток вручную. Это уже сделано за разработчика в классе Filter. Метод publishResults же вызывается в UI-потоке, чтобы опубликовать результаты на экране.

BookAutoCompleteAdapter.java

Шаг 2 – создание XML-разметки для строки подсказки

Когда подсказки загружены, будет показан выпадающий список с результатами. Каждая строка состоит из двух элементов: названия книги и имени автора.

simple_dropdown_item_2line.xml

Шаг 3 – добавление задержки перед отправкой запроса на сервер

При использовании стандартного AutoCompleteTextView запрос инициируется после каждого введенного символа. Если пользователь набирает текст без остановки, подсказки, полученные для предыдущего запроса, могут оказаться неактуальными при вводе каждого последующего символа. Это порождает ненужные и ресурсоемкие обращения к серверу, появляется шанс превышения лимитов API, которые может иметь веб-сервис, а также возвращаются устаревшие результаты, загруженные для предыдущего состояния строки запроса.

Для того, чтобы избежать вышеописанных проблем, необходимо добавить небольшую задержку между вводом символа и отправкой запроса на сервер. Если во время этой задержки человек вводит следующий символ, запрос для предыдущей строки отменяется и переносится вперед на время задержки. Если же пользователь не изменяет строку на протяжении этого времени, запрос отправляется на сервер.

Чтобы реализовать вышеописанное поведение, нужно создать кастомную реализацию AutoCompleteTextView и переопределить метод performFiltering(CharSequence text, int keyCode). Поле mAutoCompleteDelay определяет время в миллисекундах, после которого запрос будет отправлен на сервер, если пользователь не ввел новых символов.

DelayAutoCompleteTextView.java

Шаг 4 – добавление анимированного прогресса к полю ввода

Очень важно обеспечить обратную связь, когда пользователь набирает текст. Необходимо показать анимированный прогресс в поле ввода названия книги. Прогресс нужен для того, чтобы проинформировать человека о том, что подсказки загружаются и будут скоро отображены. Таким образом пользователь будет осведомлен и сможет подождать пока они не появятся. Без такой обратной связи человек может даже не подозревать о том, что поле может показывать подсказки.

Элементы ProgressBar и DelayAutoCompleteTextView необходимо поместить во FrameLayout и выровнять ProgressBar по правой стороне родительской группы. Также необходимо изначально скрыть прогресс с помощью установки атрибута android:visibility=«gone».

ProgressBar подключается к DelayAutoCompleteTextView с помощью метода setLoadingIndicator(ProgressBar view) последнего. Видимость элемента прогресса устанавливается в View.VISIBLE, когда происходит загрузка подсказок и в View.GONE, когда загрузка завершена.

Шаг 5 – соединение компонентов

Теперь, когда все части готовы, необходимо соединить их вместе:

bookTitle.setThreshold(4) определяет минимальное количество символов, которые должен ввести пользователь, чтобы были показаны подсказки.

bookTitle.setLoadingIndicator((ProgressBar) findViewById(R.id.progress_bar)) соединяет ProgressBar с DelayAutoCompleteTextView.

Важно установить OnItemClickListener для DelayAutoCompleteTextView и присвоить правильное значение полю ввода. Если этого не сделать, результат вызова метода toString() выбранного объекта будет вставлен в поле вместо названия книги.

Источник

Оцените статью