Android 将EditText电话号码格式化为用户类型

Android 将EditText电话号码格式化为用户类型,android,formatting,android-edittext,textwatcher,Android,Formatting,Android Edittext,Textwatcher,每次用户键入新字符时,我都要编辑EditText字段内容。基本上,我想格式化一个电话号码使用 我实现了一个TextWatcher,它读取字段内容并将其格式化为电话格式。但是每次我用格式化字符串设置EditText文本时,会再次调用watcher,再次设置文本,它会陷入这个无限循环中 按用户类型编辑文本的最佳或正确方法是什么 @Override public void afterTextChanged(Editable editable) { if (editable.length() &

每次用户键入新字符时,我都要编辑
EditText
字段内容。基本上,我想格式化一个电话号码使用

我实现了一个
TextWatcher
,它读取字段内容并将其格式化为电话格式。但是每次我用格式化字符串设置
EditText
文本时,会再次调用watcher,再次设置文本,它会陷入这个无限循环中

按用户类型编辑文本的最佳或正确方法是什么

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

在TextWatcher中调用setText方法时需要小心。否则将创建一个无限循环,因为您总是在更改文本

如果确实有必要,您可以尝试以下方法来设置文本:

if(!telephone.getText().toString().equals(formatted)) {
    telephone.setText(formatted);
}
而不仅仅是:

telephone.setText(formatted);

这样,您就可以避免创建无限循环

如果我可以问另一个问题,当我更改文本时,光标会返回到文本字段的开头。如何使光标停留在最后?请尝试以下有关光标定位的答案: