开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜