您好 我正在编写一个用户在编辑文本框中输入电话号码的机器人。 我希望数字是xxx-xxx-xxxx的形式,这意味着' - '应该在用户输入前3个字母和另一个' - '后自动出现
我使用了EditText anum= (EditText)findViewById(R.id.altnum);
anum.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
但只有在输入所有数字后才会进入格式。我希望在用户输入数据时进行更改,就像他按123一样,应该自动进行炒作 请告诉我怎么做。
感谢你
您诚挚的
ChinniKrishna Kothapalli
答案 0 :(得分:9)
最近,我有同样的要求。我用TextWatcher尝试过这个。在这里分享希望以后别人可能需要。
public class PhoneNumberTextWatcher implements TextWatcher {
private static final String TAG = PhoneNumberTextWatcher.class
.getSimpleName();
private EditText edTxt;
private boolean isDelete;
public PhoneNumberTextWatcher(EditText edTxtPhone) {
this.edTxt = edTxtPhone;
edTxt.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
isDelete = true;
}
return false;
}
});
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
if (isDelete) {
isDelete = false;
return;
}
String val = s.toString();
String a = "";
String b = "";
String c = "";
if (val != null && val.length() > 0) {
val = val.replace("-", "");
if (val.length() >= 3) {
a = val.substring(0, 3);
} else if (val.length() < 3) {
a = val.substring(0, val.length());
}
if (val.length() >= 6) {
b = val.substring(3, 6);
c = val.substring(6, val.length());
} else if (val.length() > 3 && val.length() < 6) {
b = val.substring(3, val.length());
}
StringBuffer stringBuffer = new StringBuffer();
if (a != null && a.length() > 0) {
stringBuffer.append(a);
if (a.length() == 3) {
stringBuffer.append("-");
}
}
if (b != null && b.length() > 0) {
stringBuffer.append(b);
if (b.length() == 3) {
stringBuffer.append("-");
}
}
if (c != null && c.length() > 0) {
stringBuffer.append(c);
}
edTxt.removeTextChangedListener(this);
edTxt.setText(stringBuffer.toString());
edTxt.setSelection(edTxt.getText().toString().length());
edTxt.addTextChangedListener(this);
} else {
edTxt.removeTextChangedListener(this);
edTxt.setText("");
edTxt.addTextChangedListener(this);
}
}
}
由于
JRH
答案 1 :(得分:6)
以下代码工作添加和删除方案很好,但逻辑更长一些:
public class PhoneNumberTextWatcher implements TextWatcher {
private static final String TAG = "PhoneNumberTextWatcher";
private EditText editText;
public PhoneNumberTextWatcher(EditText edTxtPhone) {
this.editText = edTxtPhone;
}
public void onTextChanged(CharSequence s, int cursorPosition, int before,
int count) {
if(before == 0 && count == 1){ //Entering values
String val = s.toString();
String a = "";
String b = "";
String c = "";
if (val != null && val.length() > 0) {
val = val.replace("-", "");
if (val.length() >= 3) {
a = val.substring(0, 3);
} else if (val.length() < 3) {
a = val.substring(0, val.length());
}
if (val.length() >= 6) {
b = val.substring(3, 6);
c = val.substring(6, val.length());
} else if (val.length() > 3 && val.length() < 6) {
b = val.substring(3, val.length());
}
StringBuffer stringBuffer = new StringBuffer();
if (a != null && a.length() > 0) {
stringBuffer.append(a);
}
if (b != null && b.length() > 0) {
stringBuffer.append("-");
stringBuffer.append(b);
}
if (c != null && c.length() > 0) {
stringBuffer.append("-");
stringBuffer.append(c);
}
editText.removeTextChangedListener(this);
editText.setText(stringBuffer.toString());
if(cursorPosition == 3 || cursorPosition == 7){
cursorPosition = cursorPosition+2;
}else{
cursorPosition = cursorPosition+1;
}
if(cursorPosition <= editText.getText().toString().length()) {
editText.setSelection(cursorPosition);
}else{
editText.setSelection(editText.getText().toString().length());
}
editText.addTextChangedListener(this);
} else {
editText.removeTextChangedListener(this);
editText.setText("");
editText.addTextChangedListener(this);
}
}
if(before == 1 && count == 0){ //Deleting values
String val = s.toString();
String a = "";
String b = "";
String c = "";
if (val != null && val.length() > 0) {
val = val.replace("-", "");
if(cursorPosition == 3){
val = removeCharAt(val,cursorPosition-1,s.toString().length()-1);
}else if(cursorPosition == 7){
val = removeCharAt(val,cursorPosition-2,s.toString().length()-2);
}
if (val.length() >= 3) {
a = val.substring(0, 3);
} else if (val.length() < 3) {
a = val.substring(0, val.length());
}
if (val.length() >= 6) {
b = val.substring(3, 6);
c = val.substring(6, val.length());
} else if (val.length() > 3 && val.length() < 6) {
b = val.substring(3, val.length());
}
StringBuffer stringBuffer = new StringBuffer();
if (a != null && a.length() > 0) {
stringBuffer.append(a);
}
if (b != null && b.length() > 0) {
stringBuffer.append("-");
stringBuffer.append(b);
}
if (c != null && c.length() > 0) {
stringBuffer.append("-");
stringBuffer.append(c);
}
editText.removeTextChangedListener(this);
editText.setText(stringBuffer.toString());
if(cursorPosition == 3 || cursorPosition == 7){
cursorPosition = cursorPosition-1;
}
if(cursorPosition <= editText.getText().toString().length()) {
editText.setSelection(cursorPosition);
}else{
editText.setSelection(editText.getText().toString().length());
}
editText.addTextChangedListener(this);
} else {
editText.removeTextChangedListener(this);
editText.setText("");
editText.addTextChangedListener(this);
}
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
public static String removeCharAt(String s, int pos,int length) {
String value = "";
if(length > pos){
value = s.substring(pos + 1);
}
return s.substring(0, pos)+value ;
}
}
答案 2 :(得分:3)
一种选择是实施自己的InputFilter。
您可以在此处使用我的答案:press "." many times (validate ip address in EditText while typing)和此处:How to set Edittext view allow only two numeric values and two decimal values like ##.##,了解如何在键入时解析文本。
如果您想要自动显示破折号,则需要将它们添加到过滤方法的返回值