-
Notifications
You must be signed in to change notification settings - Fork 31
FormatWatcher и форматирование в EditText "на лету"
В ситуациях, когда необходимо форматировать текст в 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)
.
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