Numéro de téléphone formatant un EditText dans Android

Je fais une application simple de carnet d’adresses (ciblant 4.2) qui prend le nom, l’adresse, la ville, l’état, le zip et le téléphone.

Je souhaite formater le numéro de téléphone en tant que numéro de téléphone (XXX) XXX-XXXX, mais je dois extraire la valeur sous forme de chaîne pour pouvoir la stocker dans ma firebase database lorsque je sauvegarde. Comment puis-je faire ceci?? J’ai le EditText défini pour l’entrée “numéro de téléphone” mais cela ne fait évidemment pas trop.

Il existe une bibliothèque appelée PhoneNumberUtils qui peut vous aider à gérer les conversions et les comparaisons de numéros de téléphone. Par exemple, utilisez …

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

… pour formater votre numéro dans un format standard.

 PhoneNumberUtils.compare(Ssortingng a, Ssortingng b); 

… aide à des comparaisons floues. Il y en a beaucoup plus. Consultez http://developer.android.com/reference/android/telephony/PhoneNumberUtils.html pour plus d’informations.

Le réglage de ps sur le EditText to phone est déjà un bon choix; éventuellement, il pourrait être utile d’append des digits par exemple dans votre mise en page, il semble que …

  

Utilisez simplement PhoneNumberFormattingTextWatcher , appelez simplement:

 editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

Une addition
Pour être clair, le backbone de PhoneNumberFormattingTextWatcher est la classe PhoneNumberUtils. La différence est que TextWatcher maintient EditText pendant que vous devez appeler PhoneNumberUtils.formatNumber() chaque fois que vous modifiez son contenu.

J’ai récemment effectué un formatage similaire à 1 (XXX) XXX-XXXX pour Android EditText. Veuillez trouver le code ci-dessous. Utilisez simplement la sous-classe TextWatcher lorsque le texte a changé d’écoute: ….

 UsPhoneNumberFormatter addLineNumberFormatter = new UsPhoneNumberFormatter( new WeakReference(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 Ssortingng mLastBeforeText; private WeakReference mWeakEditText; public UsPhoneNumberFormatter(WeakReference weakEditText) { this.mWeakEditText = weakEditText; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (after == 0 && s.toSsortingng().equals("1 ")) { clearFlag = true; } mLastStartLocation = start; mLastBeforeText = s.toSsortingng(); } @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; Ssortingng beforeValue = mLastBeforeText; Ssortingng currentValue = s.toSsortingng(); Ssortingng 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 && !allDigitSsortingng.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(allDigitSsortingng); return allDigitSsortingng; } int alreadyPlacedDigitCount = 0; // Only '1' is remaining and user pressed backspace and so we clear // the edit text. if (allDigitSsortingng.equals("1") && clearFlag) { text.clear(); clearFlag = false; return ""; } if (allDigitSsortingng.startsWith("1")) { formattedSsortingng.append("1 "); alreadyPlacedDigitCount++; } // The first 3 numbers beyond '1' must be enclosed in brackets "()" if (totalDigitCount - alreadyPlacedDigitCount > 3) { formattedSsortingng.append("(" + allDigitSsortingng.subssortingng(alreadyPlacedDigitCount, alreadyPlacedDigitCount + 3) + ") "); alreadyPlacedDigitCount += 3; } // There must be a '-' inserted after the next 3 numbers if (totalDigitCount - alreadyPlacedDigitCount > 3) { formattedSsortingng.append(allDigitSsortingng.subssortingng( alreadyPlacedDigitCount, alreadyPlacedDigitCount + 3) + "-"); alreadyPlacedDigitCount += 3; } // All the required formatting is done so we'll just copy the // remaining digits. if (totalDigitCount > alreadyPlacedDigitCount) { formattedSsortingng.append(allDigitSsortingng .subssortingng(alreadyPlacedDigitCount)); } text.clear(); text.append(formattedSsortingng.toSsortingng()); return formattedSsortingng.toSsortingng(); } } 

Utilisez simplement ceci:

En Java Code:

 editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

En code XML:

  

Ce code fonctionne pour moi. Il se formera automatiquement lorsque le texte sera modifié dans le texte d’édition.

Peut-être que le projet ci-dessous vous aide;

https://github.com/reinaldoarrosi/MaskedEditText

Ce projet contient un appel de classe de vue MaskedEditText . En premier lieu, vous devez l’append dans votre projet .

Ensuite, vous ajoutez la partie xml dans le fichier res / values ​​/ attrs.xml du projet;

       

Vous serez alors prêt à utiliser la vue MaskedEditText .

En dernier lieu, vous devez append MaskedEditText dans votre fichier XML comme vous le souhaitez ci-dessous;

  

Bien sûr, vous pouvez l’utiliser par programmation.

Après ces étapes, l’ajout de MaskedEditText apparaîtra comme ci-dessous;

entrer la description de l'image ici

Comme par programmation, si vous voulez prendre sa valeur textuelle comme non masquée, vous pouvez utiliser la ligne ci-dessous;

 maskedEditText.getText(true); 

Pour prendre une valeur masquée, vous pouvez envoyer false valeur false au lieu d’ true valeur true dans la méthode getText .

 //(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) { Ssortingng text = etMobile.getText().toSsortingng(); textlength = etMobile.getText().length(); if (text.endsWith(" ")) return; if (textlength == 1) { if (!text.contains("(")) { etMobile.setText(new SsortingngBuilder(text).insert(text.length() - 1, "(").toSsortingng()); etMobile.setSelection(etMobile.getText().length()); } } else if (textlength == 5) { if (!text.contains(")")) { etMobile.setText(new SsortingngBuilder(text).insert(text.length() - 1, ")").toSsortingng()); etMobile.setSelection(etMobile.getText().length()); } } else if (textlength == 6 || textlength == 10) { etMobile.setText(new SsortingngBuilder(text).insert(text.length() - 1, " ").toSsortingng()); etMobile.setSelection(etMobile.getText().length()); } } @Override public void afterTextChanged(Editable editable) { } } 

Vous pouvez utiliser une expression régulière avec une correspondance de modèle pour extraire le nombre d’une chaîne.

  Ssortingng s=""; Pattern p = Pattern.comstack("\\d+"); Matcher m = p.matcher("(1111)123-456-789"); //editText.getText().toSsortingng() while (m.find()) { s=s+m.group(0); } System.out.println("............"+s); Output : ............1111123456789 

Suivez les instructions de cette réponse pour formater le masque EditText.

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

Et après cela, vous pouvez attraper les numéros originaux de la chaîne masquée avec:

 Ssortingng phoneNumbers = maskedSsortingng.replaceAll("[^\\d]", ""); 

Ne t’inquiète pas. J’ai fait de mon mieux pour vous. Vous pouvez voir ce lien d’application simple ci-dessous.

 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) { Ssortingng text = mPasswordField.getText().toSsortingng(); textLength = mPasswordField.getText().length(); if (text.endsWith("-") || text.endsWith(" ") || text.endsWith(" ")) return; if (textLength == 1) { if (!text.contains("(")) { mPasswordField.setText(new SsortingngBuilder(text).insert(text.length() - 1, "(").toSsortingng()); mPasswordField.setSelection(mPasswordField.getText().length()); } } else if (textLength == 5) { if (!text.contains(")")) { mPasswordField.setText(new SsortingngBuilder(text).insert(text.length() - 1, ")").toSsortingng()); mPasswordField.setSelection(mPasswordField.getText().length()); } } else if (textLength == 6) { mPasswordField.setText(new SsortingngBuilder(text).insert(text.length() - 1, " ").toSsortingng()); mPasswordField.setSelection(mPasswordField.getText().length()); } else if (textLength == 10) { if (!text.contains("-")) { mPasswordField.setText(new SsortingngBuilder(text).insert(text.length() - 1, "-").toSsortingng()); mPasswordField.setSelection(mPasswordField.getText().length()); } } else if (textLength == 15) { if (text.contains("-")) { mPasswordField.setText(new SsortingngBuilder(text).insert(text.length() - 1, "-").toSsortingng()); mPasswordField.setSelection(mPasswordField.getText().length()); } }else if (textLength == 18) { if (text.contains("-")) { mPasswordField.setText(new SsortingngBuilder(text).insert(text.length() - 1, "-").toSsortingng()); 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) { } 

Not: N’oubliez pas “implémenter TextWatcher” avec votre classe d’activité.

Lien: https://drive.google.com/open?id=0B-yo9VvU7jyBMjJpT29xc2k5bnc

J’espère que vous vous sentez cool pour cette solution.