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(). При необходимости мы можем создать свои разделители.