tamaño studio password mayusculas flotante edittext ancho android

studio - Número de teléfono formateando un EditText en Android



styling edittext android (9)

Estoy haciendo una aplicación simple de la libreta de direcciones (dirigida a 4.2) que incluye nombre, dirección, ciudad, estado, código postal y teléfono.

Quiero formatear la entrada del número de teléfono como un número de teléfono (XXX) XXX-XXXX, pero necesito extraer el valor como una cadena para poder almacenarlo en mi base de datos cuando lo guarde. ¿¿Cómo puedo hacer esto?? Tengo EditText configurado para la entrada de "número de teléfono", pero obviamente no hace demasiado.


Hay una biblioteca llamada PhoneNumberUtils que puede ayudarlo a lidiar con las conversiones y las conversiones de los números telefónicos. Por ejemplo, use ...

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

... para formatear su número en un formato estándar.

PhoneNumberUtils.compare(String a, String b);

... ayuda con las comparaciones difusas. Hay mucho más Consulte PhoneNumberUtils para obtener más información.

Poner el EditText al phone es una buena opción; eventualmente podría ser útil agregar digits por ejemplo, en su diseño se ve como ...

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


No te preocupes Tengo la mejor solución para ti. Puede ver este simple enlace de la aplicación a continuación.

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) { }

No: no olvide "implementar TextWatcher" con su clase de actividad.

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

Espero que te sientas bien por esta solución.


Puede usar una expresión regular con coincidencia de patrón para extraer el número de una cadena.

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


Quizás debajo del proyecto de muestra te ayude;

https://github.com/reinaldoarrosi/MaskedEditText

Ese proyecto contiene una llamada de clase de vista MaskedEditText . Como primero, debes agregarlo a tu proyecto .

A continuación, agrega la parte siguiente de xml en el archivo de proyecto res / values ​​/ attrs.xml;

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

Entonces estarás listo para usar la vista de texto de MaskedEditText .

Como último, debe agregar MaskedEditText en su archivo xml como lo desea a continuación;

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

Por supuesto que puede usarlo programáticamente.

Después de esos pasos, agregar MaskedEditText aparecerá como a continuación;

Como programáticamente, si desea tomar su valor de texto como desenmascarado, puede usar la fila siguiente;

maskedEditText.getText(true);

Para tomar el valor enmascarado, puede enviar valores false lugar de true en el método getText .


Recientemente he hecho un formato similar al 1 (XXX) XXX-XXXX para Android EditText. Por favor encuentre el código a continuación. Simplemente use la subclase TextWatcher como el oyente cambiado de texto: ....

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


Siga las instrucciones en esta Respuesta para formatear la máscara EditText.

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

Y después de eso, puedes capturar los números originales de la cadena enmascarada con:

String phoneNumbers = maskedString.replaceAll("[^//d]", "");


Simplemente use PhoneNumberFormattingTextWatcher , solo llame a:

editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

Adición
Para ser claros, la backbone de PhoneNumberFormattingTextWatcher es la clase PhoneNumberUtils. La diferencia es que TextWatcher mantiene EditText mientras que debe llamar a PhoneNumberUtils.formatNumber() cada vez que cambie sus contenidos.


Simplemente use esto:

En Java Code:

editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

En código XML:

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

Este código funciona para mí. Se formateará automáticamente cuando el texto haya cambiado en el texto de edición.


//(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) { } }