用户输入电话号码时,将EditText格式化为电话号码形式

5
我希望每当用户输入新字符时,能够编辑一个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个回答

4

在 TextWatcher 中调用 setText 方法时需要小心。否则,你会创建一个无限循环,因为你一直在改变文本。

你可以尝试以下内容,只有在真正必要的情况下才设置文本:

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

相比于只有:

telephone.setText(formatted);

那么你将能够避免创建无限循环。

如果我可以再问一个问题,当我改变文本时,光标会回到文本字段的开头。我该如何让它停留在结尾? - Guilherme
2
尝试一下有关光标定位的答案:https://dev59.com/gGsz5IYBdhLWcg3wOlSh#8035171 - donfuxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接