Android-在EditText

时间:2018-08-25 22:59:59

标签: android android-edittext

我需要一点帮助使其生效,因为服务器端API需要电话号码字段的特殊格式。也许我可以在发送API请求之前通过在特定位置替换字符来编辑该字段,但是这仍然使用户可以自由地为电话号码插入错误的格式。在他更改文本并将其定向为正确格式之后,我需要立即使EditText协助他。

为此,我使用了TextWatcher方法afterTextChanged(),接下来需要的格式是:(063)22-22-333

这是我尝试过的:

private static final char space = '-';
private static final char brackets = '(';
private static final char brackets1 = ')';

etPhone.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            // (063)22-22-333

            // -> Error

            if (s.length() > 0 && !s.toString().startsWith("(")) {
                s.replace(0, s.length(), "(0");
            }

            if (s.length() > 0 && s.length() == 8) {
                final char c = s.charAt(s.length() - 1);
                if (space == c) {
                    s.delete(s.length() - 1, s.length());
                }
            } else if (s.length() > 0 && s.length() == 5) {
                final char c = s.charAt(s.length() - 1);
                if (brackets1 == c) {
                    s.delete(s.length() - 1, s.length());
                }
            }

            // Insert char where needed.
            if (s.length() > 0 && s.length() == 8) {
                char c = s.charAt(s.length() - 1);
                // Only if its a digit where there should be a space we insert a space
                if (Character.isDigit(c) && TextUtils.split(s.toString(), String.valueOf(space)).length <= 7) {
                    s.insert(s.length() - 1, String.valueOf(space));
                }
            } else if (s.length() > 0 && s.length() == 5) {
                char c = s.charAt(s.length() - 1);
                if (Character.isDigit(c) && TextUtils.split(s.toString(), String.valueOf(brackets1)).length <= 4) {
                    s.insert(s.length() - 1, String.valueOf(brackets1));
                }
            }
        }
    });

写入4个字符后出现错误。开头显示错误。

2 个答案:

答案 0 :(得分:1)

您正在使用split()方法,该方法需要第二个正则表达式作为正则表达式,这就是您的问题:您需要在正则表达式中转义“(”和“)”。所以我做了一些修改:

private static final char space = '-';
private static final char brackets = '(';
private static final char brackets1 = ')';
private static final String sspace = "\\x32";
private static final String sbrackets = "\\x28";
private static final String sbrackets1 = "\\x29";

    etPhone.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            // (063)22-22-333

            // -> Error

            if (s.length() > 0 && !s.toString().startsWith("(")) {
                s.replace(0, s.length(), "(0");
            }

            if (s.length() > 0 && s.length() == 8) {
                final char c = s.charAt(s.length() - 1);
                if (space == c) {
                    s.delete(s.length() - 1, s.length());
                }
            } else if (s.length() > 0 && s.length() == 5) {
                final char c = s.charAt(s.length() - 1);
                if (brackets1 == c) {
                    s.delete(s.length() - 1, s.length());
                }
            }

            // Insert char where needed.
            if (s.length() > 0 && s.length() == 8) {
                char c = s.charAt(s.length() - 1);
                // Only if its a digit where there should be a space we insert a space
                if (Character.isDigit(c) && TextUtils.split(s.toString(), sspace).length <= 7) {
                    s.insert(s.length() - 1, String.valueOf(space));
                }
            } else if (s.length() > 0 && s.length() == 5) {
                char c = s.charAt(s.length() - 1);
                if (Character.isDigit(c) && TextUtils.split(s.toString(), sbrackets1).length <= 4) {
                    s.insert(s.length() - 1, String.valueOf(brackets1));
                }
            }
        }
    });

现在,在3d字符之后您不会崩溃。
每次您要使用split()而不是String.valueOf(brackets1)时,请使用brackets1sbracketssspace

答案 1 :(得分:0)

从通用格式转换为服务器端期望的格式可能会更容易。为了达到标准格式,已经存在一些可以帮助您的类。您看过PhoneNumberFormattingTextWatcher吗?

如果您绝对需要使用自己的观察程序,那么还有其他实用程序可以帮助您:

// this will result in the string "(212) 555-2232"
String number = PhoneNumberUtils.formatNumber("2125552232", "US")

获得可预测的结果后,转换为服务器所需的内容应该很简单。