Cómo restringir el tiempo de entrada para edittext en android
Tengo que permitir que el usuario introduzca sólo el tiempo en el formato ##: ## en el texto de edición sobre la marcha, ¿hay alguna manera de lograrlo? He utilizado el código abajo pero no funciona.
Soy capaz de introducir el número más de 24 valor como 45623: 5689.
- ¿Cómo verificar la tarjeta PAN?
- Cómo validar String usando expresión regular en java
- Android MVP dudas sobre la validación
- Mostrar mensaje de validación
- ¿Cómo determinar si una entrada en EditText es un entero?
edit.setInputType(InputType.TYPE_DATETIME_VARIATION_TIME)
Incluso android:text="time"
tampoco funciona.
¿Cómo puedo lograr esto? ¿Puede alguien sugerirme cómo puedo hacer esto.
Quiero permitir que el usuario entre en los primeros 2 lugares hasta el valor 23 y entonces compulasary: y entonces el usuario puede permitir hasta el valor 59.
por ejemplo
23:59 correct 24:05 incorrect 02:56 correct 02:79 incorrect
He utilizado este filtro personalizar también, pero no funciona
Tengo este código de alguna otra parte en SO.
Código:
InputFilter timeFilter = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2'); } if (result.length() > 1) { c = result.charAt(1); allowEdit &= (c >= '0' && c <= '9'); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5'); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'); } return allowEdit ? null : ""; } };
Editado Pregunta: main.xml file code
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" android:padding="10dp" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:orientation="horizontal" > <TextView android:id="@+id/txtRecipientName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="20dp" android:text="@string/recipient_name" /> <EditText android:id="@+id/edTxtRecipient" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" android:paddingLeft="20dp" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:orientation="horizontal" > <TextView android:id="@+id/txtParcelDeliverTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="20dp" android:text="@string/delivered_time" /> <EditText android:id="@+id/edTxtParcelDeliverTime" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" android:paddingLeft="20dp" > </EditText> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:orientation="horizontal" > <Button android:id="@+id/btnRecipient_OK" android:layout_width="100dp" android:layout_height="wrap_content" android:text="@android:string/ok" /> </LinearLayout> </LinearLayout>
Este código está funcionando pero si inserto el primer alfabeto e inserto el valor apropiado, entonces su no funciona porque la source
contiene su valor de carácter anterior.
- Android webView: Es posible configurar el teclado numérico primero por defecto cuando se usa input type = text
- ¿Cómo comprobar un número IBAN usando el Apache IBANCheckDigit?
- ¿Cómo validar los valores de TextInput en reaccionar nativo?
- Añadir una anotación personalizada a Android Saripaar
- ¿No se muestran los indicadores de error (para validaciones de formularios) para android 4.2?
- ¿Cuál es una buena manera de limitar el número de palabras que se pueden introducir en una vista de edición de Android?
- Validación de correo electrónico en EditText - Android
- EditText campo es necesario antes de pasar a otra actividad
Trate de lanzar los caracteres a los ints, a continuación, prueba si son mayores de 24 y 60.
int a = ((int) result.charAt(0)) - 48; int b = ((int) result.charAt(1)) - 48; int c = ((int) result.charAt(3)) - 48; if(a < 0 || b < 0 || c < 0) { Not right. } if((a > 2 || (a == 2 && b > 3)) || c > 59) { Neither is this. }
Menos 48 porque el número 0 es 48 en la tabla ascii. La prueba tiene que ser ascii.
En lugar de char, ¿por qué no utiliza cadena, porque char también se puede utilizar para comparsion como puede devolver números
char c ='a'; if(c>10) //do something //OR int x = c;
Entonces, ¿por qué no usa String en lugar de char
O lo que puedes hacer es tomar los primeros dos caracteres usando subcadena o algo así y usar el método Integer.parse () para analizarlo, si se analiza con éxito, entonces es un número válido, de lo contrario no es así que se puede validar y lo mismo hacer Para los próximos dos caracteres
EDITAR
Si usted quería implementar como esto 23:59 correcto 24:05 incorrecto 02:56 correcto 02:79 incorrecto
Entonces aquí está el código que funcionó desde mi lado
public class MainActivity extends Activity { InputFilter timeFilter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timeFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2'); } if (result.length() > 1) { c = result.charAt(1); if(result.charAt(0) == '0' || result.charAt(0) == '1') allowEdit &= (c >= '0' && c <= '9'); else allowEdit &= (c >= '0' && c <= '3'); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5'); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'); } return allowEdit ? null : ""; } }; EditText txt1 = (EditText) findViewById(R.id.edTxtParcelDeliverTime); txt1.setFilters(new InputFilter[]{timeFilter}); } }
Acabo de tomar su XML y colocado como mi diseño principal Y no hay cambios en XML Ahora intentar esto y decir?
EDIT 2 Ahora aquí he añadido una validación para firs char verificación utilizando doneOnce valor booleano Esto funciona ahora, dime si tiene algún otro problema de este código ahora
public class MainActivity extends Activity { EditText edt1; InputFilter timeFilter; private String LOG_TAG = "MainActivity"; private boolean doneOnce = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timeFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if(source.length() > 1 && doneOnce == false){ source = source.subSequence(source.length()-1, source.length()); if(source.charAt(0) >= '0' && source.charAt(0) <= '2'){ doneOnce = true; return source; }else{ return ""; } } if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2'); } if (result.length() > 1) { c = result.charAt(1); if(result.charAt(0) == '0' || result.charAt(0) == '1') allowEdit &= (c >= '0' && c <= '9'); else allowEdit &= (c >= '0' && c <= '3'); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5'); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'); } return allowEdit ? null : ""; } }; edt1 = (EditText) findViewById(R.id.edTxtParcelDeliverTime); edt1.setFilters(new InputFilter[] { timeFilter }); } }
Prueba esto . Simplemente edité el código que proporcionaste ….
InputFilter[] timeFilter = new InputFilter[1]; timeFilter[0] = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2' && !(Character.isLetter(c))); } if (result.length() > 1) { c = result.charAt(1); allowEdit &= (c >= '0' && c <= '9' && !(Character.isLetter(c))); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'&&!(Character.isLetter(c))); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5' && !(Character.isLetter(c))); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'&& !(Character.isLetter(c))); } return allowEdit ? null : ""; } };
Esto funciona absolutamente bien para mí. Acepta tiempo en formato hh: mm solamente (ningún otro carácter aceptado)
- Android AppBarLayout empuja ViewPager hacia abajo
- Descubre por qué se está desinstalando una aplicación de Android