How can automatically format phone number entering edit text in Android
In my application I am enter in to phone number in dialog box,in edit text enter in mobile number automatically added into "-" example:999-999-9999 this phone number format.
final EditText text= (EditText)myDialog.findViewById(com.fitzgeraldsoftware.mobitrack.presentationlayer.R.id.Tv2);
text.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
boolean flag = true;
String eachBlock[] = text.getText().toString().split("-");
// Log.v("11111111111111111111","aa"+flag);
for (int i = 0; i < eachBlock.length; i++)
{
Log.v("11111111111111111111","aa"+i);
if (eachBlock[i].length() > 3)
{
// Log.v("11111111111111111111","cc"+flag);
flag = false;
}
}
if (flag) {
// Log.v("11111111111111111111","dd"+flag);
text.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL)
// Log.v("11111111111111111111","ee"+keyDel);
keyDel = 1;
return false;
}
});
if (keyDel == 0) {
if (((text.getText().length() + 1) % 4) == 0)
{
Log.v("11111111111111111111","bb"+((text.getText().length() + 1) % 4));
if (text.getText().toString().split("-").length <= 2)
{
// Log.v("11111111111111111111","ff"+text.getText().length());
text.setText(text.getText() + "-");
text.setSelection(text.getText().length());
}
}
Log.v("11111111111111111111","cc"+text.getText().length());
a = text.getText().toString();
} else
{
Log.v("11111111111111111111","dd"+a);
开发者_运维百科a = text.getText().toString();
keyDel = 0;
}
} else {
Log.v("11111111111111111111","ee"+a);
text.setText(a);
}
}
public void beforeTextChanged(CharSequence s, int start, int count,int after)
{
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
Output is : 999-999-999
How can handle exact output is 999-999-9999(3digits-3digits-4digits)?
Try an input filter. I haven't tested it out, but something like this should work.
text.setFilters(android.text.method.DialerKeyListener).
See also
android.text.method.DialerKeyListener
TextView.setFilters
You can use this library called International phone input for Android`hosted on github.
Its awesome and implements onValidityChangeListener
.
- Automatically format the number as the user types
- Automatically set the input placeholder to an example number for the selected country
- Selecting a country from the dropdown will update the dial code in the input
- Typing a different dial code will automatically update the displayed flag
- Easy embedding as a Custom View
- Listener available to detect validity change
- Automatically detect phone number when information available
Listen to "done" even on the keyboard
//Including in layout <net.rimoto.intlphoneinput.IntlPhoneInput android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/my_phone_input" />
just, add this textChangedListener into your edit_text
UsPhoneNumberFormatter addLineNumberFormatter = new UsPhoneNumberFormatter(
new WeakReference<EditText>(etPhone));
edit_text.addTextChangedListener(addLineNumberFormatter);
here UsPhoneNumberFormatter is a class,its extends TextWatcher
class UsPhoneNumberFormatter implements TextWatcher {
//This TextWatcher sub-class formats entered numbers as 1 (123) 456-7890
private boolean mFormatting; // this is a flag which prevents the
// stack(onTextChanged)
private boolean clearFlag;
private int mLastStartLocation;
private String mLastBeforeText;
private WeakReference<EditText> mWeakEditText;
public UsPhoneNumberFormatter(WeakReference<EditText> weakEditText) {
this.mWeakEditText = weakEditText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
if (after == 0 && s.toString().equals("1 ")) {
clearFlag = true;
}
mLastStartLocation = start;
mLastBeforeText = s.toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO: Do nothing
}
@Override
public void afterTextChanged(Editable s) {
// Make sure to ignore calls to afterTextChanged caused by the work
// done below
if (!mFormatting) {
mFormatting = true;
int curPos = mLastStartLocation;
String beforeValue = mLastBeforeText;
String currentValue = s.toString();
String formattedValue = formatUsNumber(s);
if (currentValue.length() > beforeValue.length()) {
int setCusorPos = formattedValue.length()
- (beforeValue.length() - curPos);
mWeakEditText.get().setSelection(setCusorPos < 0 ? 0 : setCusorPos);
} else {
int setCusorPos = formattedValue.length()
- (currentValue.length() - curPos);
if(setCusorPos > 0 && !Character.isDigit(formattedValue.charAt(setCusorPos -1))){
setCusorPos--;
}
mWeakEditText.get().setSelection(setCusorPos < 0 ? 0 : setCusorPos);
}
mFormatting = false;
}
}
private String formatUsNumber(Editable text) {
StringBuilder formattedString = new StringBuilder();
// Remove everything except digits
int p = 0;
while (p < text.length()) {
char ch = text.charAt(p);
if (!Character.isDigit(ch)) {
text.delete(p, p + 1);
} else {
p++;
}
}
// Now only digits are remaining
String allDigitString = text.toString();
int totalDigitCount = allDigitString.length();
if (totalDigitCount == 0
|| (totalDigitCount > 10 && !allDigitString.startsWith("1"))
|| totalDigitCount > 11) {
// May be the total length of input length is greater than the
// expected value so we'll remove all formatting
text.clear();
text.append(allDigitString);
return allDigitString;
}
int alreadyPlacedDigitCount = 0;
// Only '1' is remaining and user pressed backspace and so we clear
// the edit text.
if (allDigitString.equals("1") && clearFlag) {
text.clear();
clearFlag = false;
return "";
}
if (allDigitString.startsWith("1")) {
formattedString.append("1 ");
alreadyPlacedDigitCount++;
}
// The first 3 numbers beyond '1' must be enclosed in brackets "()"
if (totalDigitCount - alreadyPlacedDigitCount > 3) {
formattedString.append("("
+ allDigitString.substring(alreadyPlacedDigitCount,
alreadyPlacedDigitCount + 3) + ") ");
alreadyPlacedDigitCount += 3;
}
// There must be a '-' inserted after the next 3 numbers
if (totalDigitCount - alreadyPlacedDigitCount > 3) {
formattedString.append(allDigitString.substring(
alreadyPlacedDigitCount, alreadyPlacedDigitCount + 3)
+ "-");
alreadyPlacedDigitCount += 3;
}
// All the required formatting is done so we'll just copy the
// remaining digits.
if (totalDigitCount > alreadyPlacedDigitCount) {
formattedString.append(allDigitString
.substring(alreadyPlacedDigitCount));
}
text.clear();
text.append(formattedString.toString());
return formattedString.toString();
}
}
out put like this format
999-999-9999
精彩评论