How can I automatically format a phone number entering edit text in android

In my application, I enter the phone number in the dialog box, in a text editor enter the mobile phone number automatically added to the "-" 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 } }); 

: 999-999-999 how to handle the exact output 999-999-9999 (3digits-3digits-4digits)

post some solution.

+6
source share
3 answers

Try the input filter. I have not tested this, but something like this should work.

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

see also

android.text.method.DialerKeyListener

TextView.setFilters

+3
source

You can use this library called International Phone Entry for Android` hosted on github.

Surprisingly and implements onValidityChangeListener .

  • Automatically format the number by user type
  • Automatically set the input placeholder to an approximate number for the selected country
  • When you select a country from the drop-down list, the entry dialing code will be updated
  • Entering another dialing code will automatically update the displayed flag
  • Simple attachment as a custom view
  • The receiver is available to detect a change in reality.
  • Automatically detect phone number when information is available
  • Listen to "do" 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" />

0
source

just add this textChangedListener to your edit_text

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

here UsPhoneNumberFormatter is a class, it 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 is placed like this format

999-999-9999

0
source

Source: https://habr.com/ru/post/896039/


All Articles