#android #android_edittext
Достал вот этот блок edTelData.addTextChangedListener(new PhoneNumberFormattingTextWatcher() { //we need to know if the user is erasing or inputing some new character private boolean backspacingFlag = false; //we need to block the :afterTextChanges method to be called again after we just replaced the EditText text private boolean editedFlag = false; //we need to mark the cursor position and restore it after the edition private int cursorComplement; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { //we store the cursor local relative to the end of the string in the EditText before the edition cursorComplement = s.length()-edTelData.getSelectionStart(); //we check if the user ir inputing or erasing a character if (count > after) { backspacingFlag = true; } else { backspacingFlag = false; } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // nothing to do here =D } @Override public void afterTextChanged(Editable s) { String string = s.toString(); //what matters are the phone digits beneath the mask, so we always work with a raw string with only digits String phone = string.replaceAll("[^\\d]", ""); //if the text was just edited, :afterTextChanged is called another time... so we need to verify the flag of edition //if the flag is false, this is a original user-typed entry. so we go on and do some magic if (!editedFlag) { //we start verifying the worst case, many characters mask need to be added //example: 999999999 <- 6+ digits already typed // masked: (999) 999-999 if (phone.length() >= 7 && !backspacingFlag) { //we will edit. next call on this textWatcher will be ignored editedFlag = true; //here is the core. we substring the raw digits and add the mask as convenient String ans = "+7(" + phone.substring(1, 4) + ") " + phone.substring(4,7) + "-" + phone.substring(7); edTelData.setText(ans); //we deliver the cursor to its original position relative to the end of the string edTelData.setSelection(edTelData.getText().length()-cursorComplement); //we end at the most simple case, when just one character mask is needed //example: 99999 <- 3+ digits already typed // masked: (999) 99 } else if (phone.length() >= 4 && !backspacingFlag) { editedFlag = true; String ans = "+7(" +phone.substring(1, 4) + ") " + phone.substring(4); edTelData.setText(ans); edTelData.setSelection(edTelData.getText().length()-cursorComplement); } // We just edited the field, ignoring this cicle of the watcher and getting ready for the next } else { editedFlag = false; } } }); сейчас, преобразует строку при вводе в формат +7(XXX)XXX-XXXX Пожалуйста, помогите переделать в +7(XXX)XXX-XX-XX (добавить второе "-") ОБНОВЛЕНО Спасибо за ответы, теперь снизу готовый исправленный код(можно копи-пастить) edTelData.addTextChangedListener(new PhoneNumberFormattingTextWatcher() { //we need to know if the user is erasing or inputing some new character private boolean backspacingFlag = false; //we need to block the :afterTextChanges method to be called again after we just replaced the EditText text private boolean editedFlag = false; //we need to mark the cursor position and restore it after the edition private int cursorComplement; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { //we store the cursor local relative to the end of the string in the EditText before the edition cursorComplement = s.length()-edTelData.getSelectionStart(); //we check if the user ir inputing or erasing a character if (count > after) { backspacingFlag = true; } else { backspacingFlag = false; } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // nothing to do here =D } @Override public void afterTextChanged(Editable s) { String string = s.toString(); //what matters are the phone digits beneath the mask, so we always work with a raw string with only digits String phone = string.replaceAll("[^\\d]", ""); //if the text was just edited, :afterTextChanged is called another time... so we need to verify the flag of edition //if the flag is false, this is a original user-typed entry. so we go on and do some magic if (!editedFlag) { //we start verifying the worst case, many characters mask need to be added //example: 999999999 <- 6+ digits already typed // masked: (999) 999-999 if (phone.length() >= 9 && !backspacingFlag) { //we will edit. next call on this textWatcher will be ignored editedFlag = true; //here is the core. we substring the raw digits and add the mask as convenient String ans = "+7(" + phone.substring(1, 4) + ") " + phone.substring(4,7) + "-" + phone.substring(7,9) + "-" + phone.substring(9); edTelData.setText(ans); //we deliver the cursor to its original position relative to the end of the string edTelData.setSelection(edTelData.getText().length()-cursorComplement); //we end at the most simple case, when just one character mask is needed //example: 99999 <- 3+ digits already typed // masked: (999) 99 } else if (phone.length() >= 4 && !backspacingFlag) { editedFlag = true; String ans = "+7(" +phone.substring(1, 4) + ") " + phone.substring(4); edTelData.setText(ans); edTelData.setSelection(edTelData.getText().length()-cursorComplement); } // We just edited the field, ignoring this cicle of the watcher and getting ready for the next } else { editedFlag = false; } } }); А это XML - код элемента:
Ответы
Ответ 1
Изменить условие if (phone.length() >= 7 && !backspacingFlag) на if (phone.length() >= 9 && !backspacingFlag) и String ans = "+7(" + phone.substring(1, 4) + ") " + phone.substring(4,7) + "-" + phone.substring(7); Изменить на: String ans = "+7(" + phone.substring(1, 4) + ") " + phone.substring(4,7) + "-" + phone.substring(7,9) + "-" + phone.substring(9);Ответ 2
Есть небольшой косяк если стереть все и начать писать заново. Лечится проверкой на +7 if (phone.length() >= 4 && !backspacingFlag) { editedFlag = true; String beg=string.substring(0, 2); if ("+7".equals(beg)) { String ans = "+7(" + phone.substring(1, 4) + ") " + phone.substring(4); mEditTextPassword.setText(ans); mEditTextPassword.setSelection(mEditTextPassword.getText().length() - cursorComplement);} else { String ans = "+7(" + phone.substring(0, 3) + ") " + phone.substring(3); mEditTextPassword.setText(ans); mEditTextPassword.setSelection(mEditTextPassword.getText().length() - cursorComplement); } }
Комментариев нет:
Отправить комментарий