getting phone number in XXX-XXX-XXXX format from e

2019-01-19 23:53发布

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

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

3条回答
何必那么认真
2楼-- · 2019-01-20 00:35

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 ;
}
}
查看更多
Juvenile、少年°
3楼-- · 2019-01-20 00:43

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

查看更多
欢心
4楼-- · 2019-01-20 00:47

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

查看更多
登录 后发表回答