Форматирование номера телефона EditText как типов пользователей

Я хотел бы отредактировать EditText содержимое поля каждый раз, когда пользователь вводит новый символ. В основном я хочу отформатировать номер телефона, используя libphonenumber,

Я реализовал TextWatcher который читает содержимое поля и форматирует его в телефонный формат. Но каждый раз, когда я устанавливаю EditText текст с отформатированной строкой, наблюдатель вызывается снова, снова устанавливает текст и застревает в этом бесконечном цикле.

Каков наилучший или правильный способ редактирования текста в качестве пользовательских типов?

@Override
public void afterTextChanged(Editable editable) {
    if (editable.length() > 1) {
        try {
            PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
            PhoneNumber numberProto = phoneUtil.parse(editable.toString(), "BR");
            String formatted = phoneUtil.format(numberProto, PhoneNumberFormat.NATIONAL);
            telephone.setText(formatted);
        } catch (NumberParseException e) {
           Log.d("Telefone", "NumberParseException was thrown: " + e.toString());
        }
    }
}

1 ответ

Решение

Вы должны быть осторожны с вызовом метода setText внутри TextWatcher. В противном случае вы создаете бесконечный цикл, потому что вы всегда меняете текст.

Вы можете попробовать следующее только установить текст, если это действительно необходимо:

if(!telephone.getText().toString().equals(formatted)) {
    telephone.setText(formatted);
}

Вместо просто:

telephone.setText(formatted);

Таким образом, вы сможете избежать создания бесконечного цикла

Другие вопросы по тегам