Quero restringir os caracteres a 0-9, az, AZ e barra de espaço. Definindo o tipo de entrada Eu posso limitar os dígitos, mas não consigo descobrir as maneiras de o Inputfilter examinar os documentos.
android
android-edittext
Tim Wayne
fonte
fonte
InputFilter
s são um pouco complicados nas versões do Android que exibem sugestões de dicionário. Você às vezes recebe umSpannableStringBuilder
, às vezes uma planícieString
nosource
parâmetroO seguinte
InputFilter
deve funcionar. Sinta-se livre para melhorar este código!fonte
String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
source instanceof SpannableStringBuilder
digitar AB me dá AAB, como ao tentar a resposta anterior. Felizmente, consegui contornar o problema usando a solução @florian abaixo.muito facil:
fonte
","
. Você pode usar algo como isto"0123456789qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM"
imeOptions="actionNext"
, etc.Nenhuma das respostas postadas funcionou para mim. Eu vim com minha própria solução:
fonte
EditText
que já pode ter seus próprios filtros, por exemplo, filtro de comprimento. Portanto, em vez de substituir os filtros, você provavelmente deseja adicionar seus filtros aos já existentes.Use isso seu trabalho 100% da sua necessidade e muito simples.
Em strings.xml
fonte
Para evitar caracteres especiais no tipo de entrada
Você pode definir o filtro para o seu texto de edição, como abaixo
fonte
Além da resposta aceita, também é possível usar, por exemplo:
android:inputType="textCapCharacters"
como um atributo de<EditText>
, para aceitar apenas caracteres maiúsculos (e números).fonte
Por alguma razão, o construtor da classe android.text.LoginFilter tem o escopo do pacote, portanto você não pode estendê-lo diretamente (mesmo que seja idêntico a esse código). Mas você pode estender o LoginFilter.UsernameFilterGeneric! Então você apenas tem isso:
Isso não está realmente documentado, mas faz parte da lib principal e a fonte é direta . Eu o uso há algum tempo, até agora sem problemas, embora admita que não tentei fazer nada complexo envolvendo spannables.
fonte
É correto, a melhor maneira de corrigi-lo no próprio layout XML usando:
como corretamente apontado por Florian Fröhlich, ele funciona bem para exibições de texto.
Apenas uma palavra de cautela, os caracteres mencionados no
android:digits
serão exibidos apenas, portanto, tenha cuidado para não perder nenhum conjunto de caracteres :)fonte
inputType
, não afeta a filtragem.Essa solução simples funcionou para mim quando eu precisei impedir o usuário de inserir cadeias vazias em um EditText. Obviamente, você pode adicionar mais caracteres:
fonte
Se você subclassificar InputFilter, poderá criar seu próprio InputFilter que filtraria quaisquer caracteres não alfanuméricos.
A Interface InputFilter possui um método
filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
e fornece todas as informações necessárias sobre quais caracteres foram inseridos no EditText ao qual está atribuído.Depois de criar seu próprio InputFilter, você pode atribuí-lo ao EditText chamando setFilters (...).
http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence , int, int, android.text.Spanned, int, int)
fonte
Ignorando as coisas de extensão com as quais outras pessoas lidaram, para lidar adequadamente com as sugestões de dicionário, achei o seguinte código funcionando.
A fonte cresce à medida que a sugestão aumenta, por isso temos que ver quantos caracteres ele realmente espera que substituamos antes de retornar alguma coisa.
Se não tivermos caracteres inválidos, retorne nulo para que a substituição padrão ocorra.
Caso contrário, precisamos extrair os caracteres válidos da substring que REALMENTE será colocada no EditText.
fonte
para impedir palavras no edittext. crie uma classe que você possa usar a qualquer momento.
fonte
Primeiro adicione em
strings.xml
:XML :
Código em Kotlin:
Estranho, mas funciona estranhamente no teclado virtual do emulador.
Aviso! O código a seguir filtrará todas as letras e outros símbolos, exceto os dígitos dos teclados de software. Somente o teclado digital aparecerá nos smartphones.
Eu também geralmente fixados
maxLength
,filters
,inputType
.fonte
Esse é um tópico antigo, mas as soluções propostas têm problemas (dependendo do dispositivo / versão do Android / teclado).
ABORDAGEM DIFERENTE
Então, eventualmente, eu segui uma abordagem diferente, em vez de usar a
InputFilter
implementação problemática, estou usandoTextWatcher
eTextChangedListener
aEditText
.CÓDIGO COMPLETO (EXEMPLO)
O motivo
InputFilter
não é uma boa solução no Android, pois depende da implementação do teclado. A entrada do teclado está sendo filtrada antes de ser passada para oEditText
. Porém, como alguns teclados têm implementações diferentes para aInputFilter.filter()
chamada, isso é problemático.Por outro lado,
TextWatcher
não se preocupa com a implementação do teclado, pois permite criar uma solução simples e garantir que funcione em todos os dispositivos.fonte
onTextChanged
simplesmente precisa de umpublic void
na frente dele.Fiz algo assim para simplificar:
Dessa forma, estamos substituindo todos os caracteres indesejados na nova parte da cadeia de origem por uma cadeia vazia.
A
edit_text
variável é aEditText
objeto ao qual estamos nos referindo.O código está escrito
kotlin
.fonte
É possível usar
setOnKeyListener
. Neste método, podemos personalizar a entradaedittext
!fonte
Foi assim que criei um filtro para o campo Nome em Editar texto. (A primeira letra é CAPS e permite apenas um espaço após cada palavra.
fonte
Eu tenho a mesma resposta em Kotlin:
e obtenha a classe com a função Extension:
fonte