AutoCompleteTextView представляет элемент, созданный на основе класса EditText
и обладающий возможностью автодополнения
Во-первых, объявим в ресурсе разметке данный элемент:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <AutoCompleteTextView android:id="@+id/autocomplete" android:layout_width="0dp" android:layout_height="wrap_content" android:completionHint="Введите город" android:completionThreshold="1" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Атрибут android:completionHint позволяет задать надпись, которая отображается внизу списка, а свойство android:completionThreshold устанавливает, какое количество символов надо ввести, чтобы начало работать автодополнение. То есть в данном случае уже после ввода одного символа должен появться список с подстановками.
Как и в случае с элементами ListView и Spinner, AutoCompleteTextView подключается к источнику данных через адаптер. Источником данных опять же может служить массив или список объектов, либо ресурс string-array.
Теперь подключим к виджету массив строк в классе MainActivity:
package com.example.listapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; public class MainActivity extends AppCompatActivity { String[] cities = {"Москва", "Самара", "Вологда", "Волгоград", "Саратов", "Воронеж"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Получаем ссылку на элемент AutoCompleteTextView в разметке AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autocomplete); // Создаем адаптер для автозаполнения элемента AutoCompleteTextView ArrayAdapter<String> adapter = new ArrayAdapter (this, R.layout.support_simple_spinner_dropdown_item, cities); autoCompleteTextView.setAdapter(adapter); } }
После ввода в текстовое поле одной буквы отобразится список с вариантами автодополнения, где можно выбрать предпочтительный:
Этот виджет дополняет функциональность элемента AutoCompleteTextView. MultiAutoCompleteTextView позволяет использовать автодополнения не только для одной строки, но и для отдельных слов. Например, если вводится слово и после него ставится запятая, то автозаполнение все равно будет работать для вновь вводимых слов после запятой или другого разделителя.
MultiAutoCompleteTextView имеет такую же форму объявления, как и AutoCompleteTextView:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <MultiAutoCompleteTextView android:id="@+id/autocomplete" android:layout_width="0dp" android:layout_height="wrap_content" android:completionHint="Введите город" android:completionThreshold="1" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Чтобы включить MultiAutoCompleteTextView в коде, надо установить токен разделителя:
package com.example.listapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.MultiAutoCompleteTextView; public class MainActivity extends AppCompatActivity { String[] cities = {"Москва", "Самара", "Вологда", "Волгоград", "Саратов", "Воронеж"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Получаем ссылку на элемент AutoCompleteTextView в разметке MultiAutoCompleteTextView autoCompleteTextView = findViewById(R.id.autocomplete); // Создаем адаптер для автозаполнения элемента MultiAutoCompleteTextView ArrayAdapter<String> adapter = new ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, cities); autoCompleteTextView.setAdapter(adapter); // установка запятой в качестве разделителя autoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); } }
Здесь в качестве разделителя используется встроенный разделитель на основе запятой CommaTokenizer(). При необходимости мы можем создать свои разделители.