Віджет автодоповнення AutoCompleteTextView

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);
    }
}

Після введення в текстове поле однієї літери відобразиться список з варіантами автодоповнення, де можна вибрати бажаний варіант:

MultiAutoCompleteTextView

Цей віджет доповнює функціональність елемента 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(). За необхідності ми можемо створити свої роздільники.