如何在android中自动格式化输入编辑文本的电话号码

时间:2011-08-27 14:55:11

标签: android

在我的应用程序中我输入对话框中的电话号码,在编辑文本中输入手机号码自动添加到“ - ”例如:999-999-9999这个电话号码格式

  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

        }


     });

输出为:999-999-999 如何处理确切的输出是999-999-9999(3digits-3digits-4digits)

请转发一些解决方案。

3 个答案:

答案 0 :(得分:3)

尝试输入过滤器。我没有测试过,但是这样的事情应该有效。

text.setFilters(android.text.method.DialerKeyListener).

另见

android.text.method.DialerKeyListener

TextView.setFilters

答案 1 :(得分:0)

您可以在github上使用名为International phone input for Android`的库。

它很棒并且实现了import requests response = requests.post('http://127.0.0.1:8080, data='http://python.org')

  • 自动格式化用户输入的数字
  • 自动将输入占位符设置为示例编号 选定的国家/地区
  • 从下拉列表中选择国家/地区将更新拨号代码 输入
  • 键入不同的拨号代码将自动更新显示的内容 标志
  • 轻松嵌入自定义视图
  • 侦听器可用于检测有效性更改
  • 可用信息时自动检测电话号码
  • 听取&#34;完成&#34;甚至在键盘上

    onValidityChangeListener

答案 2 :(得分:0)

只需将此textChangedListener添加到您的edit_text

     UsPhoneNumberFormatter addLineNumberFormatter = new UsPhoneNumberFormatter(
            new WeakReference<EditText>(etPhone));
            edit_text.addTextChangedListener(addLineNumberFormatter);

这里的UsPhoneNumberFormatter是一个类,它扩展了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();
}
}

像这种格式出来

999-999-9999