我需要一点帮助使其生效,因为服务器端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个字符后出现错误。开头显示错误。
答案 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)
时,请使用brackets1
或sbrackets
或sspace
答案 1 :(得分:0)
从通用格式转换为服务器端期望的格式可能会更容易。为了达到标准格式,已经存在一些可以帮助您的类。您看过PhoneNumberFormattingTextWatcher
吗?
如果您绝对需要使用自己的观察程序,那么还有其他实用程序可以帮助您:
// this will result in the string "(212) 555-2232"
String number = PhoneNumberUtils.formatNumber("2125552232", "US")
获得可预测的结果后,转换为服务器所需的内容应该很简单。