Format EditText view for phone numbers Format EditText view for phone numbers android android

Format EditText view for phone numbers


With this code you can make a custom TextWatcher and make any format you desire:

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 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() >= 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;            }        }    });

Ensure to limit the EditText Lenght in XML to 14 characters

<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"/>


Step 1: Here the code for input field in XML file.

 <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"/>

Step 2: Here is the code add into the MainFile.java

 phoneNo = (EditText)findViewById(R.id.editText_phone); phoneNo.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

Output: It will give you the number like (123)456-7890


Try this

The PhoneNumberFormattingTextWatcher() method was not working i tried allot finally i get the solutions

  1. In your xml file paste this

    <EditTextandroid:id="@+id/editTextId"android:layout_height="wrap_content"android:layout_width="match_parent"android:inputType="phone"android:digits="0123456789+" />
  2. in your oncreate method paste this

    final EditText editText = (EditText) findViewById(R.id.editTextId);editText.addTextChangedListener(new TextWatcher(){    @Override    public void onTextChanged(CharSequence s, int start, int before, int count)    {        // TODO Auto-generated method stub    }    @Override    public void beforeTextChanged(CharSequence s, int start, int count, int after)    {        // TODO Auto-generated method stub    }    @Override    public void afterTextChanged(Editable s)    {        String text = editText.getText().toString();        int  textLength = editText.getText().length();        if (text.endsWith("-") || text.endsWith(" ") || text.endsWith(" "))            return;        if (textLength == 1) {            if (!text.contains("("))            {                editText.setText(new StringBuilder(text).insert(text.length() - 1, "(").toString());                editText.setSelection(editText.getText().length());            }        }        else if (textLength == 5)        {            if (!text.contains(")"))            {                editText.setText(new StringBuilder(text).insert(text.length() - 1, ")").toString());                editText.setSelection(editText.getText().length());            }        }        else if (textLength == 6)        {            editText.setText(new StringBuilder(text).insert(text.length() - 1, " ").toString());            editText.setSelection(editText.getText().length());        }        else if (textLength == 10)        {            if (!text.contains("-"))            {                editText.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString());                editText.setSelection(editText.getText().length());            }        }        else if (textLength == 15)        {            if (text.contains("-"))            {                editText.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString());                editText.setSelection(editText.getText().length());            }        }        else if (textLength == 18)        {            if (text.contains("-"))            {                editText.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString());                editText.setSelection(editText.getText().length());            }        }    }});

OUTPUT:-enter image description here