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