Eu quero definir um valor mínimo e máximo para um EditText
.
Por exemplo: se alguém tentar inserir um valor mensal, o valor deverá estar entre 1 e 12.
Posso fazer isso usando, TextWatcher
mas quero saber se existe outra maneira de fazer isso no arquivo de layout ou em outro local.
Editar: não quero limitar a contagem de caracteres. Eu quero limitar o valor. Por exemplo, se eu limitar os EditText
caracteres do mês w quando digitar 12, ele será aceito, mas se eu inserir 22, ele não deverá ser aceito enquanto eu estiver inserindo.
android
android-edittext
mertaydin
fonte
fonte
Respostas:
Primeiro faça esta classe:
Em seguida, use isso na sua Atividade:
Isso permitirá que o usuário insira valores de 1 a 12 apenas .
EDIT:
Defina seu edittext com
android:inputType="number"
.Você pode encontrar mais detalhes em https://www.techcompose.com/how-to-set-minimum-and-maximum-value-in-edittext-in-android-app-development/ .
Obrigado.
fonte
source
substituirão alguns caracteres emdest
. Eu acho que você deve simular a substituição e obter o resultado final e validá-lo.Há um pequeno erro no código do Pratik. Por exemplo, se um valor for 10 e você adicionar 1 no início para fazer 110, a função de filtro tratará o novo valor como 101.
Veja abaixo uma correção para isso:
fonte
String replacement = source.subSequence(start, end).toString(); String newVal = dest.subSequence(0, dstart).toString() + replacement + dest.subSequence(dend, dest.length()).toString();
String newVal= dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend, dest.toString().length());
, parece mais limpo e claro.min==3
se é impossível digitar qualquer número começando com 1 ou 2 (por exemplo: 15, 23)Do que eu vi da solução do @ Patrik e da adição do @ Zac, o código fornecido ainda tem um grande problema:
Se
min==3
for impossível digitar qualquer número começando com 1 ou 2 (ex: 15, 23)Se
min>=10
for impossível digitar qualquer coisa, pois todo número terá que começar com 1,2,3 ...No meu entendimento, não podemos alcançar a limitação min-max do
EditText
valor de um com o uso simples da classeInputFilterMinMax
, pelo menos não para o valor min, porque quando o usuário está digitando um número positivo, o valor cresce e podemos facilmente executar um teste on-the-fly para verificar se atingiu o limite ou saiu do intervalo e bloqueia as entradas que não estão em conformidade. Testar o valor mínimo é uma história diferente, pois não podemos ter certeza se o usuário terminou de digitar ou não e, portanto, não podemos decidir se devemos bloquear ou não.Não é exatamente o que o OP solicitou, mas para fins de validação eu combinei na minha solução um
InputFilter
para testar os valores máximos e umOnFocusChangeListener
para re-testar o valor mínimo quandoEditText
perde o foco, assumindo que o usuário terminou de digitar e é algo assim:E
OnFocusChangeListenerMin
Em Atividade, defina o
InputFilterMax
e oOnFocusChangeListenerMin
paraEditText
observar: Você pode 2 in e max inonFocusChangeListener
.fonte
if(Integer.valueOf(val)<min){ //Notify user that the value is not good }
Você pode fazer o que quiser, notificar o usuário e defina EditText como em branco, não sei se isso responde à sua perguntaExtensão da resposta de Pratik e Zac. Zac corrigiu um pequeno bug do Pratik em sua resposta. Mas notei que o código não suporta valores negativos; ele lançará uma NumberFormatException. Para corrigir isso e permitir que o MIN seja negativo, use o código a seguir.
Adicione esta linha (em negrito) entre as outras duas linhas:
newVal = newVal.substring (0, dstart) + source.toString () + newVal.substring (dstart, newVal.length ());
if (newVal.equalsIgnoreCase ("-") && min <0) retorna nulo;
int input = Integer.parseInt (newVal);
fonte
Se você precisar de um intervalo com números negativos como -90: 90, poderá usar esta solução.
fonte
Estendi o código @Pratik Sharmas para usar objetos BigDecimal em vez de ints, para que ele possa aceitar números maiores e levar em conta qualquer formatação no EditText que não seja um número (como formatação de moeda, como espaços, vírgulas e pontos)
EDIT: observe que esta implementação tem 2 como os valores mínimos significativos definidos no BigDecimal (consulte a constante MIN_SIG_FIG) como eu usei para moeda, portanto, sempre havia 2 números iniciais antes do ponto decimal. Altere a constante MIN_SIG_FIG conforme necessário para sua própria implementação.
fonte
Eu encontrei minha própria resposta. É muito tarde agora, mas quero compartilhar com você. Eu implemento esta interface:
E, em seguida, implemente-o dessa maneira dentro de sua atividade:
Esta é uma resposta muito simples, se for o caso, por favor me diga.
fonte
Há algo errado na resposta aceita.
Se eu mover o cursor para o meio do texto, digite algo, a instrução acima produzirá um resultado errado. Por exemplo, digite "12" primeiro, depois digite "0" entre 1 e 2; a declaração mencionada acima produzirá "120" em vez de 102. Modifiquei esta declaração para as declarações abaixo:
fonte
Kotlin se alguém precisar (Use Utilities)
Então use isso da sua classe Kotlin
Este EditText permite de 1 a 100.
Em seguida, use isso no seu XML
fonte
Eu fiz uma maneira mais simples de definir um mínimo / máximo para um texto de edição. Eu uso o teclado aritmético e trabalho com este método:
O método aceita todos os seus valores, mas se um valor de usuários não aderir aos seus limites, ele será definido automaticamente para o limite mínimo / máximo. Por ex. limit limin = 10, limax = 80 se o usuário definir 8, automaticamente 10 será salvo em uma variável e EditText como 10.
fonte
Eu sei que já existem um milhão de respostas para isso, com uma aceita. No entanto, existem inúmeros erros na resposta aceita e a maioria dos demais simplesmente corrige um (ou talvez dois) deles, sem expandir para todos os casos de uso possíveis.
Então, eu basicamente compilei a maioria das correções sugeridas nas respostas de suporte, além de adicionar um método para permitir a entrada contínua de números fora do intervalo na direção de 0 (se o intervalo não começar em 0), pelo menos até que seja certo de que não pode mais estar no intervalo. Porque, para ficar claro, este é o único momento que realmente causa problemas em muitas das outras soluções.
Aqui está a correção:
Observe que é impossível lidar com alguns casos de entrada "ativamente" (ou seja, como o usuário está inserindo), portanto, devemos ignorá-los e tratá-los depois que o usuário terminar de editar o texto.
Veja como você pode usá-lo:
Agora, quando o usuário tentar digitar um número mais próximo de 0 do que o intervalo permite, uma das duas coisas acontecerá:
Se
min
emax
tiverem o mesmo número de dígitos, eles não terão permissão para inseri-lo assim que chegarem ao dígito final.Se um número fora do intervalo for deixado no campo quando o texto perder o foco, ele será ajustado automaticamente para o limite mais próximo.
E, é claro, o usuário nunca poderá inserir um valor além de 0 do que o intervalo permite, nem é possível que um número como esse "acidentalmente" esteja no campo de texto por esse motivo.
Problemas conhecidos
EditText
foco for perdido quando o usuário terminar.A outra opção é desinfetar quando o usuário pressiona a tecla "concluído" / retornar, mas em muitos ou até na maioria dos casos, isso causa uma perda de foco de qualquer maneira.
No entanto, fechar o teclado virtual não desvira o foco automaticamente do elemento. Tenho certeza de que 99,99% dos desenvolvedores do Android gostariam que sim (e que o manuseio do foco nos
EditText
elementos era menos desagradável em geral), mas até o momento não há nenhuma funcionalidade integrada para isso. O método mais fácil que eu encontrei para contornar isso, se necessário, é estenderEditText
algo assim:Isso "engana" o filtro para higienizar a entrada, mesmo que a visualização não tenha realmente perdido o foco. Se, posteriormente, a visão perder o foco por conta própria, o saneamento de entrada será acionado novamente, mas nada mudará, pois já foi corrigido.
Encerramento
Ufa. Isso foi muito. O que originalmente parecia ser um problema trivialmente fácil acabou descobrindo muitos pedaços feios de baunilha Android (pelo menos em Java). E mais uma vez, você só precisa adicionar o ouvinte e estender
EditText
se o seu intervalo não incluir 0 de alguma forma. (E realisticamente, se seu intervalo não incluir 0, mas começar em 1 ou -1, você também não terá problemas.)Como última nota, isso funciona apenas para ints . Certamente, existe uma maneira de implementá-lo para trabalhar com decimais (
double
,float
), mas, como nem eu nem o solicitante original precisamos disso, não quero aprofundar muito nisso. Seria muito fácil simplesmente usar a filtragem pós-conclusão junto com as seguintes linhas:Você teria apenas que mudar de
int
parafloat
(oudouble
), permitir a inserção de um único.
(ou,
, dependendo do país?) E analisar como um dos tipos decimais em vez de umint
.Isso lida com a maior parte do trabalho de qualquer maneira, portanto, funcionaria de maneira muito semelhante.
fonte
fonte
Exemplo muito simples no Kotlin:
fonte
por favor verifique este código
Use o link abaixo para obter mais detalhes sobre o edittext e os edittextfilteres com o observador de texto.
http://www.mobisoftinfotech.com/blog/android/android-edittext-setfilters-example-numeric-text-field-patterns-and-length-restriction/
fonte
Se você está preocupado apenas com o limite máximo, basta adicionar a linha abaixo
Se você precisar adicionar um limite mínimo, nesse caso, o limite mínimo é 7. o usuário está restrito a inserir caracteres entre o limite mínimo e máximo (entre 8 e 10)
Se você também precisar restringir o usuário a inserir 01 no início, modifique se a condição for desta maneira
No final da chamada, como
fonte
@Pratik Sharma
Para números negativos de suporte , adicione o seguinte código no método de filtro :
Em seguida, use isso na sua Atividade:
Defina seu edittext com:
fonte
// ainda tem algum problema, mas aqui você pode usar min, max em qualquer faixa (positiva ou negativa)
fonte
Para adicionar à resposta do Pratik, aqui está uma versão modificada na qual o usuário pode digitar min 2 dígitos também, por exemplo, 15 a 100:
Espero que isto ajude. gentilmente não voto negativo sem motivos.
fonte
aqui está o jeito que eu usei, está trabalhando para um número negativo
Primeiro, crie a classe MinMaxFIlter.java com o seguinte código:
Em seguida, crie e defina seu filtro para seu edittext assim:
fonte
este é o meu código max = 100, min = 0
xml
Java
fonte
Você pode fazer isso com um InputFilter. Aparentemente, existe apenas essa interface de filtro de entrada que você pode usar. Antes de fazer isso da maneira irritante e criar uma nova classe que estenda o filtro de entrada, você pode usar esse atalho com uma instanciação da interface da classe interna.
Portanto, você apenas faz isso:
Neste exemplo, verifico se o valor do EditText é maior que 8. Caso contrário, ele deve ser definido como 8. Portanto, é necessário que você consiga acompanhar o mínimo máximo ou a lógica do filtro. Mas pelo menos você pode escrever a lógica do filtro de maneira bem organizada e curta diretamente no EditText.
Espero que isto ajude
fonte
Para definir o valor mínimo do EditText, usei isso:
fonte
O código do @ Patrik tem uma boa idéia, mas com muitos erros. @Zac e @Anthony B (soluções de números negativos) resolveram alguns deles, mas o código de @ Zac ainda possui 3 erros principais:
1. Se o usuário excluir todas as entradas no EditText, é impossível digitar qualquer número novamente. É claro que isso pode ser controlado usando um ouvinte alterado EditText em cada campo, mas apagará a beleza de usar uma classe InputFilter comum para cada EditText no seu aplicativo.
2. O @ Guernee4 diz que, por exemplo min = 3, é impossível digitar qualquer número começando com 1.
3. Se, por exemplo, min = 0, você pode digitar quantos zeros desejar, o resultado não é elegante. Ou também, se não importa qual é o valor mínimo, o usuário pode colocar o cursor no tamanho esquerdo do primeiro número, colocar vários zeros à esquerda, também não é elegante.
Eu vim com essas pequenas mudanças no código do @ Zac para resolver esses 3 bugs. Em relação ao bug nº 3, ainda não consegui remover completamente todos os zeros à esquerda; Sempre pode ser um, mas um 00, 01, 0100 etc, nesse caso, é mais elegante e válido que um 000000, 001, 000100, etc.etc. Etc.
Aqui está o código:
Tenha um bom dia!
fonte
Aqui está minha opinião sobre a resposta de Pratik Sharma
Kotlin
eDouble
se alguém precisafonte