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)

  • Android: ¿Cómo establecer números y caracteres aceptables en EditText?
  • Validación en Editar texto
  • RxJava- validación de formulario RxAndroid en dynamic EditText
  • Validación nula en el cuadro EditarTexto de Alert Dialog - Android
  • Cómo cambiar la contraseña usando la contraseña antigua en el análisis de android
  • Android manual X509 validación de la cadena de certificados
  • Android: validar contraseña, conformar contraseña y pasar un valor de cadena a través de botón
  • Permitir sólo charcters seleccionados basados ​​en regex en un EditText
  • Validar "desde fecha" y "hasta la fecha" en android
  • Centrarse en segundo edittext sólo si primero es no-vacío android
  • Entrada de archivo HTML en Chrome para Android falta extensión y tipo mime
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.