使用PhoneNumberUtils中的电话号码格式NaN屏蔽EditText

我想在editText中input用户input的电话号码,以便每次用户input一个号码时dynamic改变格式。 也就是说,当用户input4位数字时,如7144,editText显示“714-4”。 我想editTextdynamic更新格式### – ### – ####每当用户input一个数字。 如何才能做到这一点? 另外,我正在处理多个editTexts。

最简单的方法是使用内置的Android PhoneNumberFormattingTextWatcher 。

所以基本上你得到你的EditText在代码中,并设置你的文字看守这样的…

EditText inputField = (EditText) findViewById(R.id.inputfield); inputField.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

使用PhoneNumberFormattingTextWatcher的好处是,它将基于您的语言环境正确地格式化您的号码条目。

上面的答案是正确的,但它适用于具体国家。 如果有人想要格式化的电话号码(### – ### – ####)。 然后使用这个:

 etPhoneNumber.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { int digits = etPhoneNumber.getText().toString().length(); if (digits > 1) lastChar = etPhoneNumber.getText().toString().substring(digits-1); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { int digits = etPhoneNumber.getText().toString().length(); Log.d("LENGTH",""+digits); if (!lastChar.equals("-")) { if (digits == 3 || digits == 7) { etPhoneNumber.append("-"); } } } @Override public void afterTextChanged(Editable s) { } }); 

在你的活动中声明String lastChar = " "

现在将这行添加到您的edittext的xml中

 android:inputType="phone" 

就这样。

编辑:如果你想你的edittext长度限制10位数字也添加下面的行:

 android:maxLength="12" 

(因为“ – ”需要两次空间,所以是12)

只需将以下内容添加到EditText以获取电话号码(### – ### – ####)

 Phone.addTextChangedListener(new TextWatcher() { int length_before = 0; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { length_before = s.length(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (length_before < s.length()) { if (s.length() == 3 || s.length() == 7) s.append("-"); if (s.length() > 3) { if (Character.isDigit(s.charAt(3))) s.insert(3, "-"); } if (s.length() > 7) { if (Character.isDigit(s.charAt(7))) s.insert(7, "-"); } } } }); 

我的脚本,这里取自这里的例子


 <android.support.design.widget.TextInputLayout android:id="@+id/numphone_layout" app:hintTextAppearance="@style/MyHintText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp"> <android.support.design.widget.TextInputEditText android:id="@+id/edit_text_numphone" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/MyEditText" android:digits="+() 1234567890-" android:hint="@string/hint_numphone" android:inputType="phone" android:maxLength="17" android:textSize="14sp" /> </android.support.design.widget.TextInputLayout> 

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextInputEditText phone = (TextInputEditText) findViewById(R.id.edit_text_numphone); //Add to mask phone.addTextChangedListener(textWatcher); } TextWatcher textWatcher = new TextWatcher() { private boolean mFormatting; // this is a flag which prevents the stack overflow. private int mAfter; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // nothing to do here.. } //called before the text is changed... @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { //nothing to do here... mAfter = after; // flag to detect backspace.. } @Override public void afterTextChanged(Editable s) { // Make sure to ignore calls to afterTextChanged caused by the work done below if (!mFormatting) { mFormatting = true; // using US or RU formatting... if(mAfter!=0) // in case back space ain't clicked... { String num =s.toString(); String data = PhoneNumberUtils.formatNumber(num, "RU"); if(data!=null) { s.clear(); s.append(data); Log.i("Number", data);//8 (999) 123-45-67 or +7 999 123-45-67 } } mFormatting = false; } } };