Номер телефона, форматирующий EditText в Android

Я делаю простое приложение адресной книги (таргетинг 4.2), которое принимает имя, адрес, город, штат, почтовый индекс и телефон.

Я хочу отформатировать номер телефона в качестве номера телефона (XXX) XXX-XXXX, но мне нужно вывести значение в виде строки, чтобы сохранить его в своей базе данных при сохранении. Как я могу это сделать?? У меня есть набор EditText для ввода номера телефона, но это явно не слишком много.

Solutions Collecting From Web of "Номер телефона, форматирующий EditText в Android"

Существует библиотека под названием PhoneNumberUtils, которая может помочь вам справиться с преобразованиями номеров телефонов и сравнениями. Например, используйте …

EditText text = (EditText) findViewById(R.id.editTextId); PhoneNumberUtils.formatNumber(text.getText().toString()) 

… для форматирования вашего номера в стандартном формате.

 PhoneNumberUtils.compare(String a, String b); 

… помогает с нечеткими сравнениями. Есть еще много. Просмотрите http://developer.android.com/reference/android/telephony/PhoneNumberUtils.html для получения дополнительной информации.

Ps настройка EditText на phone уже является хорошим выбором; В конце концов, может быть полезно добавить digits например, в вашем макете, это выглядит как …

 <EditText android:id="@+id/editTextId" android:inputType="phone" android:digits="0123456789+" /> 

Просто используйте PhoneNumberFormattingTextWatcher , просто позвоните:

 editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

прибавление
Чтобы быть ясным, основой PhoneNumberFormattingTextWatcher является класс PhoneNumberUtils. Разница заключается в том, что TextWatcher поддерживает EditText, пока вы вызываете PhoneNumberUtils.formatNumber() каждый раз, когда вы меняете его содержимое.

Недавно я сделал аналогичное форматирование, например, 1 (XXX) XXX-XXXX для Android EditText. Пожалуйста, найдите код ниже. Просто используйте подкласс класса TextWatcher в качестве текстового редактора: ….

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

 private 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(); } } 

Просто используйте это:

В коде Java:

 editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

В XML-коде:

 <EditText android:id="@+id/etPhoneNumber" android:inputType="phone"/> 

Этот код работает для меня. Он будет автоматически форматироваться при изменении текста в текстовом редакторе.

Возможно, под примером проекта вам поможет;

https://github.com/reinaldoarrosi/MaskedEditText

Этот проект содержит вызов класса вида MaskedEditText . Во-первых, вы должны добавить его в свой проект .

Затем вы добавляете ниже xml-часть в файл res / values ​​/ attrs.xml проекта;

 <resources> <declare-styleable name="MaskedEditText"> <attr name="mask" format="string" /> <attr name="placeholder" format="string" /> </declare-styleable> </resources> 

Затем вы будете готовы использовать MaskedEditText .

Как и последнее, вы должны добавить MaskedEditText в свой XML-файл, что вы хотите, как показано ниже;

 <packagename.currentfolder.MaskedEditText xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/maskedEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:text="5" app:mask="(999) 999-9999" app:placeholder="_" > 

Конечно, вы можете использовать его программно.

После этих шагов добавление MaskedEditText будет выглядеть, как MaskedEditText ниже;

Введите описание изображения здесь

Как программно, если вы хотите использовать его текстовое значение как unmasked, вы можете использовать ниже строки;

 maskedEditText.getText(true); 

Чтобы получить значение в масках, вы можете отправить false значение вместо true значения в методе getText .

Вы можете использовать регулярное выражение с совпадением шаблонов для извлечения числа из строки.

  String s=""; Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher("(1111)123-456-789"); //editText.getText().toString() while (m.find()) { s=s+m.group(0); } System.out.println("............"+s); Output : ............1111123456789 
 <EditText android:id="@+id/etnumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:digits="0123456789+" android:hint="Contact Number" /> 

Не волнуйся. Я предлагаю вам самое лучшее решение. Вы можете увидеть эту простую ссылку для приложения ниже.

 private EditText mPasswordField; public int textLength = 0; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPasswordField = (EditText) findViewById(R.id.password_field); mPasswordField.addTextChangedListener(this); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String text = mPasswordField.getText().toString(); textLength = mPasswordField.getText().length(); if (text.endsWith("-") || text.endsWith(" ") || text.endsWith(" ")) return; if (textLength == 1) { if (!text.contains("(")) { mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "(").toString()); mPasswordField.setSelection(mPasswordField.getText().length()); } } else if (textLength == 5) { if (!text.contains(")")) { mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, ")").toString()); mPasswordField.setSelection(mPasswordField.getText().length()); } } else if (textLength == 6) { mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, " ").toString()); mPasswordField.setSelection(mPasswordField.getText().length()); } else if (textLength == 10) { if (!text.contains("-")) { mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString()); mPasswordField.setSelection(mPasswordField.getText().length()); } } else if (textLength == 15) { if (text.contains("-")) { mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString()); mPasswordField.setSelection(mPasswordField.getText().length()); } }else if (textLength == 18) { if (text.contains("-")) { mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString()); mPasswordField.setSelection(mPasswordField.getText().length()); } } else if (textLength == 20) { Intent i = new Intent(MainActivity.this, Activity2.class); startActivity(i); } } @Override public void afterTextChanged(Editable s) { } 

Не: Не забудьте «реализовать TextWatcher» с вашим классом активности.

Ссылка: https://drive.google.com/open?id=0B-yo9VvU7jyBMjJpT29xc2k5bnc

Надеюсь, вы чувствуете себя круто для этого решения.

Следуйте инструкциям в этом ответе, чтобы отформатировать маску EditText.

https://stackoverflow.com/a/34907607/1013929

И после этого вы можете поймать исходные числа из замаскированной строки:

 String phoneNumbers = maskedString.replaceAll("[^\\d]", ""); 
 //(123) 456 7890 formate set private int textlength = 0; public class MyPhoneTextWatcher implements TextWatcher { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { String text = etMobile.getText().toString(); textlength = etMobile.getText().length(); if (text.endsWith(" ")) return; if (textlength == 1) { if (!text.contains("(")) { etMobile.setText(new StringBuilder(text).insert(text.length() - 1, "(").toString()); etMobile.setSelection(etMobile.getText().length()); } } else if (textlength == 5) { if (!text.contains(")")) { etMobile.setText(new StringBuilder(text).insert(text.length() - 1, ")").toString()); etMobile.setSelection(etMobile.getText().length()); } } else if (textlength == 6 || textlength == 10) { etMobile.setText(new StringBuilder(text).insert(text.length() - 1, " ").toString()); etMobile.setSelection(etMobile.getText().length()); } } @Override public void afterTextChanged(Editable editable) { } }