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.

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.

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)

  • Cómo restringir el EditText para aceptar sólo caracteres alfanuméricos
  • Mostrar mensaje de validación
  • Mostrar error si el usuario introduce sólo espacios en EditText - Android
  • ¿Cómo validar los valores de TextInput en reaccionar nativo?
  • ¿Cómo validar una cadena usando java regex?
  • ¿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?
  • Cómo validar un nombre de URL / sitio web en EditText en Android?
  • ¿Cómo validar edittext con números enteros en android?
  • Validación en EditText permitir IP o web Url host
  • Entrada de archivo HTML en Chrome para Android falta extensión y tipo mime
  • Android: validar contraseña, conformar contraseña y pasar un valor de cadena a través de botón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.