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

Je fais une simple application 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 l'entrée du numéro de téléphone en tant que numéro de téléphone (XXX) XXX-XXXX, mais je dois retirer la valeur en tant que chaîne de sorte que je peux la stocker dans ma base de données lorsque j'enregistre. Comment puis-je faire ceci?? J'ai le set EditText pour l'entrée "numéro de téléphone" mais cela ne fait évidemment pas trop.

  • Le dossier de données de l'application Android Google Drive ne répertorie pas tous les enfants
  • Android: propagez l'état parent vers une vue enfant
  • Erreur: échec de l'exécution pour la tâche ': application: packageRelease'. > Impossible de calculer hash de /../AndroidStudioProjects/../classes.jar
  • Google App Engine - Cloud Endpoints - Le nom de l'application n'est pas défini
  • Dois-je utiliser Android LocationManager.getBestProvider chaque fois que je demande des mises à jour de localisation?
  • Plusieurs liens cliquables dans TextView sur Android
  • 10 Solutions collect form web for “Numéro de téléphone formant un EditText dans Android”

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

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

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

     PhoneNumberUtils.compare(String a, String b); 

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

    Ps définir le EditText pour le phone est déjà un bon choix; Éventuellement, il pourrait être utile d'ajouter des digits par exemple dans votre mise en page, il semble que …

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

    Utilisez simplement PhoneNumberFormattingTextWatcher , appelez simplement:

     editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

    Une addition
    Pour être clair, PhoneNumberFormattingTextWatcher's backbone 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 fait un format similaire à celui de 1 (XXX) XXX-XXXX pour Android EditText. Trouvez le code ci-dessous. Utilisez simplement la sous-classe TextWatcher en tant qu'écoute modifiée par le texte: ….

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

    Utilisez simplement ceci:

    Dans le code Java:

     editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

    Dans le code XML:

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

    Ce code fonctionne pour moi. Il sera automatiquement formaté lorsque le texte a changé dans le texte d'édition.

    Peut-être que sous exemple de projet vous aide;

    https://github.com/reinaldoarrosi/MaskedEditText

    Ce projet contient un appel de classe de vue MaskedEditText . D'abord, vous devriez l'ajouter dans votre projet .

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

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

    Ensuite, vous serez prêt à utiliser la vue MaskedEditText .

    En dernier, vous devez ajouter MaskedEditText dans votre fichier xml ce que vous voulez comme ci-dessous;

     <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="_" > 

    Bien sûr, vous pouvez l'utiliser par programme.

    Après ces étapes, ajouter MaskedEditText apparaîtra comme ci-dessous;

    Entrez la description de l'image ici

    Comme programme, si vous souhaitez que la valeur du texte soit démasquée, vous pouvez utiliser la ligne ci-dessous;

     maskedEditText.getText(true); 

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

    Vous pouvez utiliser une expression régulière avec une correspondance de motif pour extraire le numéro d'une chaîne.

      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" /> 

    Ne vous inquiétez pas. Je vous ai fait une bonne solution. 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) { 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) { } 

    Non: 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.

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

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

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

     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) { } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.