Skip to content

FormatWatcher и форматирование в EditText "на лету"

Mike Art edited this page Oct 28, 2016 · 3 revisions

Format watcher

В ситуациях, когда необходимо форматировать текст в TextView "на лету", например во время ввода пользователем текста в EditText, нам необходимо постоянно модифицировать текст внутри маски. Для этой цели используется абстракный класс FormatWatcher. Класс инкапсулирует создание маски и работу с ней. Создание маски не определено в базовом классе и дожно быть реализовано в наследниках. Format watcher устанавливается на TextView и отслеживает изменения текста с помощью механизма TextWatcher.

ВАЖНО: не рекомендуется ипользование format watcher'ов вместе с другими TextWatcher'ами. Для получения оповещений об изменении текста в TextView можно использовать FormattedTextChangeListener. Он устанавливается на watcher методом FormatWatcher#setCallback(FormattedTextChangeListener).

Модуль предоставляет реализацию format watcher'a - FormatWatcherImpl. Этот watcher позволяет менять маску уже после того как был установлен на TextView. Маска создается на основе MaskDescriptor и (при необходимости) SlotsParser.

Для корректной работы FormatWatcherImpl требуется указать MaskDescriptor. Сделать это необходимо до установки watcher'a на TextView - в конструкторе FormatWatcherImpl или с помощью метода FormatWatcherImpl#changeMask(MaskDescriptor) (с помощью этого метода можно также сменить маску после установки watcher'a).

Если указанный MaskDescriptor содержит массив слотов, то его достаточно для создания маски. Если же в декрипторе указана только raw-маска, то для создания маски потребуется предоставить SlotsParser. Сделать это можно либо в конструкторе FormatWatcherImpl, либо с помощью метода FormatWatcherImpl#setSlotsParser(SlotsParser).

Привер 12. Создание watcher с raw-маской и отображением _ на местах для ввода:

final EditText editText = (EditText) findViewById(R.id.editCustom);
FormatWatcher formatWatcher = new FormatWatcherImpl(
        new UnderscoreDigitSlotsParser(),
        MaskDescriptor.ofRawMask("___ ___ ___", true).withShowingEmptySlots(true)
);
formatWatcher.installOnAndFill(editText);
editText.setText("123456");
System.out.println(editText.getText());    // 123 456 ___
editText.getText().insert(0, "789");
System.out.println(editText.getText());    // 789 123 456