我有一个EditText视图,我希望它将用户的输入格式化为电话号码格式.例如,当用户键入1234567890时,一旦输入前3个数字,EditText视图应该动态显示为“(123)456-7890”.
@H_404_9@解决方法
我在我的OnCreate尝试了以下内容,但似乎没有为我做任何事情
EditText ET = (EditText) findViewById(R.id.add_number); ET.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
使用此代码,您可以自定义TextWatcher并制作任何您想要的格式:
ET.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()-ET.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 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() >= 6 && !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 = "(" + phone.substring(0,3) + ") " + phone.substring(3,6) + "-" + phone.substring(6); ET.setText(ans); //we deliver the cursor to its original position relative to the end of the string ET.setSelection(ET.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() >= 3 && !backspacingFlag) { editedFlag = true; String ans = "(" +phone.substring(0,3) + ") " + phone.substring(3); ET.setText(ans); ET.setSelection(ET.getText().length()-cursorComplement); } // We just edited the field,ignoring this cicle of the watcher and getting ready for the next } else { editedFlag = false; } } });
确保将XML中的EditText Lenght限制为14个字符
<EditText android:id="@+id/editText_phone" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="phone" android:lines="1" android:maxLength="14"/>