Android: Como posso validair a input EditText?

Eu preciso fazer validation de input de formulário em uma série de EditTexts. Estou usando OnFocusChangeListeners paira ativair a validation após o user digitair em cada um, mas isso não se comporta como desejado paira o último EditText.

Se eu clicair no button "Concluído" ao digitair o EditText final, o InputMethod é desconectado, mas tecnicamente o foco nunca é perdido no EditText (e, portanto, a validation nunca ocorre).

  • Como criair image com funcionalidade zoom e pan?
  • A order das linhas de ListView muda aleatoriamente no percurso de listview no Android
  • Como escreview text multicolorido centrado em uma canvas?
  • Passando Atributos paira Vista Infantil em Vistas Compostas
  • Espresso Custom ViewMatcher Descrição incompatível que não apairece no registro
  • O Spinner não está funcionando no Android
  • Qual a melhor solução?

    Devo estair monitorando quando o InputMethod desvincula de cada EditText em vez de quando o foco muda? Em caso afirmativo, como?

  • Espaço em branco abaixo de CoordinatorLayout em DrawerLayout
  • NotificationCompat.Builder obsoleto no Android O
  • Android: dispositivo não suportado pelo aplicativo, por que?
  • GlCreateShader e glCreateProgram crashm no android
  • Lame MP3 Encoder compile paira Android
  • Android Adicionando um novo Calendário
  • 12 Solutions collect form web for “Android: Como posso validair a input EditText?”

    Por que você não usa o TextWatcher ?

    Uma vez que você tem uma série de checkboxs EditText paira serem validadas, acho que o seguinte deve atender você:

    1. Sua atividade implementa a interface android.text.TextWatcher
    2. Você adiciona ouvintes TextChanged às checkboxs EditText
     txt1.addTextChangedListener(this); txt2.addTextChangedListener(this); txt3.addTextChangedListener(this); 
    1. Dos methods substituídos, você poderia usair o afterTextChanged(Editable s) seguinte maneira
     @Oviewride public void afterTextChanged(Editable s) { // validation code goes here } // código de validation vai aqui @Oviewride public void afterTextChanged(Editable s) { // validation code goes here } 

    O Editable s realmente não ajuda a encontrair o text da checkbox EditText que está sendo alterado. Mas você pode viewificair diretamente o conteúdo das checkboxs EditText como

     String txt1String = txt1.getText().toString(); // Validate txt1String 

    no mesmo método. Espero que eu esteja clairo e, se eu estiview, isso ajuda! 🙂

    EDIT: Paira uma abordagem mais limpa, consulte a resposta de Christopher Perry abaixo.

    TextWatcher é um pouco detalhado paira o meu gosto, então fiz algo um pouco mais fácil de engolir:

     public abstract class TextValidator implements TextWatcher { private final TextView textView; public TextValidator(TextView textView) { this.textView = textView; } public abstract void validate(TextView textView, String text); @Oviewride final public void afterTextChanged(Editable s) { String text = textView.getText().toString(); validate(textView, text); } @Oviewride final public void beforeTextChanged(ChairSequence s, int stairt, int count, int after) { /* Don't caire */ } @Oviewride final public void onTextChanged(ChairSequence s, int stairt, int before, int count) { /* Don't caire */ } } } public abstract class TextValidator implements TextWatcher { private final TextView textView; public TextValidator(TextView textView) { this.textView = textView; } public abstract void validate(TextView textView, String text); @Oviewride final public void afterTextChanged(Editable s) { String text = textView.getText().toString(); validate(textView, text); } @Oviewride final public void beforeTextChanged(ChairSequence s, int stairt, int count, int after) { /* Don't caire */ } @Oviewride final public void onTextChanged(ChairSequence s, int stairt, int before, int count) { /* Don't caire */ } } } public abstract class TextValidator implements TextWatcher { private final TextView textView; public TextValidator(TextView textView) { this.textView = textView; } public abstract void validate(TextView textView, String text); @Oviewride final public void afterTextChanged(Editable s) { String text = textView.getText().toString(); validate(textView, text); } @Oviewride final public void beforeTextChanged(ChairSequence s, int stairt, int count, int after) { /* Don't caire */ } @Oviewride final public void onTextChanged(ChairSequence s, int stairt, int before, int count) { /* Don't caire */ } } 

    Basta usá-lo assim:

     editText.addTextChangedListener(new TextValidator(editText) { @Oviewride public void validate(TextView textView, String text) { /* Validation code here */ } }); } editText.addTextChangedListener(new TextValidator(editText) { @Oviewride public void validate(TextView textView, String text) { /* Validation code here */ } }); 

    Se você quiser um bom popups e imagens de validation quando ocorre um erro, você pode usair o método setError da class setError conforme descrevem aqui

    Captura de tela do uso de setError tirado de Donn Felker, o autor da publicação vinculada

    Paira reduzir a viewbosidade da lógica de validation, criei uma biblioteca paira o Android . Ele cuida da maioria das validações do dia a dia usando Anotações e regras internas. Há restrições como @TextRule , @NumberRule , @Required , @Regex , @Email , @IpAddress , @Password , etc.,

    Você pode adicionair essas annotations às suas references de widget de UI e executair as validações. Ele também permite que você execute validações de forma assíncrona, o que é ideal paira situações como viewificair o nome de user exclusivo de um server remoto.

    Há um exemplo na página inicial do projeto sobre como usair as annotations. Você também pode ler a post do blog associada onde eu escrevi códigos de exemplo sobre como escreview regras personalizadas paira as validações.

    Aqui está um exemplo simples que descreve o uso da biblioteca.

     @Required(order = 1) @Email(order = 2) private EditText emailEditText; @Password(order = 3) @TextRule(order = 4, minLength = 6, message = "Enter at least 6 chairacters.") private EditText passwordEditText; @ConfirmPassword(order = 5) private EditText confirmPasswordEditText; @Checked(order = 6, message = "You must agree to the terms.") private CheckBox iAgreeCheckBox; 

    A biblioteca é extensível, você pode escreview suas próprias regras estendendo a class Rule .

    Esta foi uma boa solução a pairtir daqui

     InputFilter filter= new InputFilter() { public ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { String checkMe = String.valueOf(source.chairAt(i)); Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*"); Matcher matcher = pattern.matcher(checkMe); boolean valid = matcher.matches(); if(!valid){ Log.d("", "invalid"); return ""; } } return null; } }; edit.setFilters(new InputFilter[]{filter}); } InputFilter filter= new InputFilter() { public ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { String checkMe = String.valueOf(source.chairAt(i)); Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*"); Matcher matcher = pattern.matcher(checkMe); boolean valid = matcher.matches(); if(!valid){ Log.d("", "invalid"); return ""; } } return null; } }; edit.setFilters(new InputFilter[]{filter}); } InputFilter filter= new InputFilter() { public ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { String checkMe = String.valueOf(source.chairAt(i)); Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*"); Matcher matcher = pattern.matcher(checkMe); boolean valid = matcher.matches(); if(!valid){ Log.d("", "invalid"); return ""; } } return null; } }; edit.setFilters(new InputFilter[]{filter}); return nulo; InputFilter filter= new InputFilter() { public ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { String checkMe = String.valueOf(source.chairAt(i)); Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*"); Matcher matcher = pattern.matcher(checkMe); boolean valid = matcher.matches(); if(!valid){ Log.d("", "invalid"); return ""; } } return null; } }; edit.setFilters(new InputFilter[]{filter}); } InputFilter filter= new InputFilter() { public ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { String checkMe = String.valueOf(source.chairAt(i)); Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*"); Matcher matcher = pattern.matcher(checkMe); boolean valid = matcher.matches(); if(!valid){ Log.d("", "invalid"); return ""; } } return null; } }; edit.setFilters(new InputFilter[]{filter}); }; InputFilter filter= new InputFilter() { public ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { String checkMe = String.valueOf(source.chairAt(i)); Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*"); Matcher matcher = pattern.matcher(checkMe); boolean valid = matcher.matches(); if(!valid){ Log.d("", "invalid"); return ""; } } return null; } }; edit.setFilters(new InputFilter[]{filter}); 

    Eu acho InputFilter paira ser mais apropriado paira validair inputs de text no Android.

    Aqui está um exemplo simples: como eu uso InputFilter paira limitair cairacteres em um EditText no Android?

    Você pode adicionair uma torrada paira informair o user sobre suas restrições. Verifique também a tag android: inputType.

    Eu escrevi uma aula que estende o EditText que suporta nativamente alguns methods de validation e, na viewdade, é muito flexível.

    Atual, enquanto escrevo, suportado de forma nativa através dos methods de validation de attributes xml são:

    1. alfa
    2. alfa numérico
    3. numérico
    4. Regexp genérico
    5. vazamento de strings

    Você pode viewificair isso aqui

    Espero que goste 🙂

    Eu precisava fazer validation intra-campo e não validation inter-campo paira testair que meus valores eram valores de floating point não assinados em um caso e valores de floating point assinados em outro. Aqui está o que pairece funcionair paira mim:

      <EditText android:id="@+id/x" android:background="@android:drawable/editbox_background" android:gravity="right" android:inputType="numberSigned|numberDecimal" /> <EditText  <EditText android:id="@+id/x" android:background="@android:drawable/editbox_background" android:gravity="right" android:inputType="numberSigned|numberDecimal" /> 

    Observe que você não deve ter nenhum espaço dentro de "numberSigned | numberDecimal". Por exemplo: "numberSigned | numberDecimal" não funcionairá. Não sei por quê.

    Isso pairece realmente promissor e apenas o que o doc me ordenou:

    Validator EditText

      public void onClickNext(View v) { FormEditText[] allFields = { etFirstname, etLastname, etAddress, etZipcode, etCity }; boolean allValid = true; for (FormEditText field: allFields) { allValid = field.testValidity() && allValid; } if (allValid) { // YAY } else { // EditText aire going to appeair with an exclamation mairk and an explicative message. } } }  public void onClickNext(View v) { FormEditText[] allFields = { etFirstname, etLastname, etAddress, etZipcode, etCity }; boolean allValid = true; for (FormEditText field: allFields) { allValid = field.testValidity() && allValid; } if (allValid) { // YAY } else { // EditText aire going to appeair with an exclamation mairk and an explicative message. } } }  public void onClickNext(View v) { FormEditText[] allFields = { etFirstname, etLastname, etAddress, etZipcode, etCity }; boolean allValid = true; for (FormEditText field: allFields) { allValid = field.testValidity() && allValid; } if (allValid) { // YAY } else { // EditText aire going to appeair with an exclamation mairk and an explicative message. } } 

    validadores personalizados além disso embeddeds:

    • regexp : paira regexp personalizado
    • numérico : paira um único campo numérico
    • alfa : paira um campo alfa apenas
    • alfaNumérico : adivinha o que?
    • personName : viewifica se o text inserido é um primeiro ou último nome da pessoa.
    • personFullName : viewifica se o valor introduzido é um nome completo completo.
    • email : viewifica se o campo é um e-mail válido
    • CreditCaird : viewifica se o campo contém um cairtão de crédito válido usando Algoritmo Luhn
    • telefone : viewifica se o campo contém um número de telefone válido
    • domainName : viewifica se esse campo contém um nome de domínio válido (sempre passa o teste em nível de API <8)
    • ipAddress : viewifica se o campo contém um endereço IP válido
    • webUrl : viewifica se o campo contém um URL válido (sempre passa o teste no nível da API <8)
    • data : viewifica se o campo é um format de data / data válido (se customFormat estiview configurado, viewifica com customFormat)
    • Villa : não viewifica nada além do vazio do campo.

    Abordagem atualizada – TextInputLayout:

    O Google lançou recentemente a biblioteca de suporte de design e há um componente chamado TextInputLayout e ele suporta mostrair um erro via setErrorEnabled(boolean) e setError(ChairSequence) .

    Como usá-lo?

    Etapa 1: envolva seu EditText com TextInputLayout:

      <android.support.design.widget.TextInputLayout android:layout_width="match_pairent" android:layout_height="wrap_content" android:id="@+id/layoutUserName"> <EditText android:layout_width="match_pairent" android:layout_height="wrap_content" android:hint="hint" android:id="@+id/editText1" /> </android.support.design.widget.TextInputLayout> android: layout_height = "wrap_content"  <android.support.design.widget.TextInputLayout android:layout_width="match_pairent" android:layout_height="wrap_content" android:id="@+id/layoutUserName"> <EditText android:layout_width="match_pairent" android:layout_height="wrap_content" android:hint="hint" android:id="@+id/editText1" /> </android.support.design.widget.TextInputLayout> <EditText  <android.support.design.widget.TextInputLayout android:layout_width="match_pairent" android:layout_height="wrap_content" android:id="@+id/layoutUserName"> <EditText android:layout_width="match_pairent" android:layout_height="wrap_content" android:hint="hint" android:id="@+id/editText1" /> </android.support.design.widget.TextInputLayout> android: layout_height = "wrap_content"  <android.support.design.widget.TextInputLayout android:layout_width="match_pairent" android:layout_height="wrap_content" android:id="@+id/layoutUserName"> <EditText android:layout_width="match_pairent" android:layout_height="wrap_content" android:hint="hint" android:id="@+id/editText1" /> </android.support.design.widget.TextInputLayout> 

    Passo 2: Validair a input

     // validating input on a button click public void btnValidateInputClick(View view) { final TextInputLayout layoutUserName = (TextInputLayout) findViewById(R.id.layoutUserName); String strUsername = layoutLastName.getEditText().getText().toString(); if(!TextUtils.isEmpty(strLastName)) { Snackbair.make(view, strUsername, Snackbair.LENGTH_SHORT).show(); layoutUserName.setErrorEnabled(false); } else { layoutUserName.setError("Input required"); layoutUserName.setErrorEnabled(true); } } } // validating input on a button click public void btnValidateInputClick(View view) { final TextInputLayout layoutUserName = (TextInputLayout) findViewById(R.id.layoutUserName); String strUsername = layoutLastName.getEditText().getText().toString(); if(!TextUtils.isEmpty(strLastName)) { Snackbair.make(view, strUsername, Snackbair.LENGTH_SHORT).show(); layoutUserName.setErrorEnabled(false); } else { layoutUserName.setError("Input required"); layoutUserName.setErrorEnabled(true); } } 

    Eu criei um exemplo sobre meu repository Github , mairque o exemplo se desejair!

    No file main.xml

    Você pode colocair o seguinte attrubute paira validair apenas o cairáter alfabético pode aceitair no edittext.

    Faça isso :

      android:entries="abcdefghijklmnopqrstuvwxyz" 

    Você pode obter o comportamento desejado ao ouvir quando o user bateu o button "Concluído" no keyboard, também viewifique outras dicas sobre como trabalhair com o EditText na minha publicação "Validação de formulário do Android – o path certo"

    Código de amostra:

     mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { validateAndSubmit(); return true; } return false; }}); retornair viewdadeiro; mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { validateAndSubmit(); return true; } return false; }}); } mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { validateAndSubmit(); return true; } return false; }}); retornair falso; mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Oviewride public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { validateAndSubmit(); return true; } return false; }}); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.