简体   繁体   中英

getting phone number in XXX-XXX-XXXX format from edittext box in android

Hi I am writing an android in which user enters phone number in an edit text box. I want the number to be in the form of xxx-xxx-xxxx that means '-' should come automatically after user enters first 3 letters and another '-'

I used EditText anum= (EditText)findViewById(R.id.altnum); anum.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); EditText anum= (EditText)findViewById(R.id.altnum); anum.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

but it is coming into format only after all the digits are entered. I want the change to come when the user was entering the data like if he press 123 a hypen should come automatically Please tell me how to do this.

Thanking You

Yours Sincerely

ChinniKrishna Kothapalli

Recently, I had a requirement for the same. I tried this with TextWatcher. Sharing here with a hope that Someone else may need later.

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

}
 }

Thanks

JRH

Following Code works adding and deleting scenario's fine but logic is some what longer:

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 ;
}
}

One option is to implement your own InputFilter .

You can use my answers here: press "." many times (validate ip address in EditText while typing) and here: How to set Edittext view allow only two numeric values and two decimal values like ##.## for examples on how to parse the text while typing.

If you want the dashes to appear automatically, you will need to add them to the return of your filter method

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM