2011-05-21 16 views

Respuesta

50

En el XML, poner esto:

android:digits="abcdefghijklmnopqrstuvwxyz1234567890 " 
+0

gracias, ¡eso es exactamente lo que estaba buscando! –

+0

nice answer.gracias mucho –

+1

Wow Android lo hace tan fácil. iOS necesita 1000 veces más esfuerzo para lograr la misma funcionalidad. – Moe

-9

Esto debería funcionar:

textView.setInputType(InputType.TYPE_CLASS_NUMBER); 
+0

Esto solo permite los números – richy

15

Aquí es una solución mejor ......... https://groups.google.com/forum/?fromgroups=#!topic/android-developers/hS9Xj3zFwZA

InputFilter filter = new InputFilter() { 
     public CharSequence filter(CharSequence source, int start, int end, 
Spanned dest, int dstart, int dend) { 
       for (int i = start; i < end; i++) { 
         if (!Character.isLetterOrDigit(source.charAt(i))) { 
           return ""; 
         } 
       } 
       return null; 
     } 
}; 

edit.setFilters(new InputFilter[]{filter}); 
+0

Solución mucho mejor al permitir Mayúsculas. –

+0

Esta solución funciona para casos simples de caracteres individuales que se tipean, pero no maneja adecuadamente copiar y pegar, o cuando otros 'InputFilters' se establecen en' EditText'. He publicado una solución más completa. –

5

La solución InputFilter funciona bien y le da control total para filtrar la entrada en un nivel de grano más fino que android:digits. El método debe devolver filter()null si todos los caracteres son válidos, o una CharSequence de sólo los caracteres válidos si algunos caracteres no son válidos. Si se copian y se pegan varios caracteres, y algunos no son válidos, solo se deben conservar los caracteres válidos (@ la solución de AchJ rechazará el pegado completo si alguno de los caracteres es inválido).

public static class AlphaNumericInputFilter implements InputFilter { 
    public CharSequence filter(CharSequence source, int start, int end, 
      Spanned dest, int dstart, int dend) { 

     // Only keep characters that are alphanumeric 
     StringBuilder builder = new StringBuilder(); 
     for (int i = start; i < end; i++) { 
      char c = source.charAt(i); 
      if (Character.isLetterOrDigit(c)) { 
       builder.append(c); 
      } 
     } 

     // If all characters are valid, return null, otherwise only return the filtered characters 
     boolean allCharactersValid = (builder.length() == end - start); 
     return allCharactersValid ? null : builder.toString(); 
    } 
} 

También, cuando se establece un InputFilter, debe asegurarse de no sobrescribir otra InputFilters en su conjunto EditText; estos se pueden establecer en XML, como android:maxLength. También debe considerar el orden en que se establece el InputFilters. Cuando se usa junto con un filtro de longitud, su filtro personalizado debe insertarse antes del filtro de longitud, de esa manera el texto pegado aplica el filtro personalizado antes del filtro de longitud (la solución @ AchJ sobrescribirá todos los demás InputFilters y solo aplicará el personalizado).

// Apply the filters to control the input (alphanumeric) 
    ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(editText.getFilters())); 
    curInputFilters.add(0, new AlphaNumericInputFilter()); 
    InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]); 
    editText.setFilters(newInputFilters); 
+0

para simplificar los setFilters que haría: editText.setFilters (nueva InputFilter [] {new CurrencyFormatInputFilter()}); – Rocel

+1

@Rocel lea cuidadosamente mi explicación: "_Usted debe asegurarse de no sobrescribir otros InputFilters establecidos en su EditarTexto, los cuales podrían establecerse en XML, como' androide: maxLength'._" Su sugerencia sería sobrescribir cualquier otro' InputFilter', al igual que la solución de @ AchJ, que * no * es lo que queremos hacer aquí. –

+1

oh ok, leí mal entonces, mi mal;) – Rocel

Cuestiones relacionadas