Форматирование номера телефона 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());
        }
    }
}

person Guilherme    schedule 08.04.2014    source источник


Ответы (1)


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

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

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

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

telephone.setText(formatted);

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

person donfuxx    schedule 08.04.2014
comment
Если я могу задать другой вопрос, когда я изменяю текст, курсор возвращается к началу текстового поля. Как я могу сделать так, чтобы он оставался в конце? - person Guilherme; 08.04.2014
comment
Попробуйте этот ответ о позиционировании курсора: stackoverflow.com/a/8035171/2399024 - person donfuxx; 08.04.2014