问题
Have a look at my codes:
txt_HomeNo.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
boolean flag = true;
String eachBlock[] = txt_HomeNo.getText().toString().split("-");
for (int i = 0; i < eachBlock.length; i++) {
if (eachBlock[i].length() > 3) {
flag = false;
}
}
if (flag) {
txt_HomeNo.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL)
keyDel = 1;
return false;
}
});
if (keyDel == 0) {
if (((txt_HomeNo.getText().length() + 1) % 4) == 0) {
if (txt_HomeNo.getText().toString().split("-").length <= 3) {
txt_HomeNo.setText(txt_HomeNo.getText() + "-");
txt_HomeNo.setSelection(txt_HomeNo.getText().length());
}
}
a = txt_HomeNo.getText().toString();
} else {
a = txt_HomeNo.getText().toString();
keyDel = 0;
}
} else {
txt_HomeNo.setText(a);
}
}
The maximum length of the phone number is only 7. And when I already inputted 3 digits, it appends dash (that's what I'd like to happen) but my problem here is that the next 3 digits also appends dash (Like this: 511-871-
)... My question is how can I do the codings with the next 4 digit number with having a dash on it. Please help me with this. thanks!
回答1:
Try this
@Override
public void afterTextChanged(Editable text) {
if (text.length() == 3 || text.length() == 7) {
text.append('-');
}
}
or all of this
private boolean isFormatting;
private boolean deletingHyphen;
private int hyphenStart;
private boolean deletingBackward;
@Override
public void afterTextChanged(Editable text) {
if (isFormatting)
return;
isFormatting = true;
// If deleting hyphen, also delete character before or after it
if (deletingHyphen && hyphenStart > 0) {
if (deletingBackward) {
if (hyphenStart - 1 < text.length()) {
text.delete(hyphenStart - 1, hyphenStart);
}
} else if (hyphenStart < text.length()) {
text.delete(hyphenStart, hyphenStart + 1);
}
}
if (text.length() == 3 || text.length() == 7) {
text.append('-');
}
isFormatting = false;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (isFormatting)
return;
// Make sure user is deleting one char, without a selection
final int selStart = Selection.getSelectionStart(s);
final int selEnd = Selection.getSelectionEnd(s);
if (s.length() > 1 // Can delete another character
&& count == 1 // Deleting only one character
&& after == 0 // Deleting
&& s.charAt(start) == '-' // a hyphen
&& selStart == selEnd) { // no selection
deletingHyphen = true;
hyphenStart = start;
// Check if the user is deleting forward or backward
if (selStart == start + 1) {
deletingBackward = true;
} else {
deletingBackward = false;
}
} else {
deletingHyphen = false;
}
}
回答2:
I think , I have easy solution to doing this, look at attached screenshot
Appending / after 2 and 5 digit to get DOB.
Appending and Deleting both are working without cyclic problem.
editeTextDob.addTextChangedListener(new TextWatcher() {
int prevL = 0;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
prevL = dob.getText().toString().length();
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
int length = editable.length();
if ((prevL < length) && (length == 2 || length == 5)) {
editable.append("/");
}
}
});
回答3:
Use this code This code working for me It will help you
editText.addTextChangedListener(new TextWatcher() {
int prevL = 0;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
prevL = editText.getText().toString().length();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
int length = s.length();
if ((prevL < length) && (length == 2 || length == 5)) {
String data = editText.getText().toString();
editText.setText(data + "/");
editText.setSelection(length + 1);
}
}
});
回答4:
Too late but can help the other people !
edtMoneyIntMin.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) {
try {
int edtInteger = Integer.valueOf(edtMoneyIntMin.getText().toString());
new DecimalFormat("1,000,000,000");
String myString = NumberFormat.getInstance().format(edtInteger).replace(",", "/");
HOUSE_COST_MIN = myString;
txtMoneyIntMin.setText(myString);
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
回答5:
For this kind of request i usually rely on editText Masking technique.
Here is one library that works well:
https://github.com/egslava/edittext-mask
but the one i like the best for handling deleting characters is :
compile 'com.redmadrobot:inputmask:2.3.0'
it has a phone number example in the readme.
来源:https://stackoverflow.com/questions/16976173/adding-a-dash-in-the-edittext-automatically-in-android