2015-10-12 17 views
10

Sono nuovo nello sviluppo mobile Android (sviluppo nativo di Android Studio - per nuove conoscenze). E qui voglio fare una domanda sulle migliori pratiche per la validazione dell'input. Per quanto ne sappiamo, quando uno sviluppatore sviluppa un modulo di input. Dobbiamo impedire a un utente di immettere un input errato nel campo di testo. Quindi ecco la mia domanda,Best Practice: Input Validation (Android)

  1. Possiamo creare un file java solo a scopo di convalida? Tutto il modulo di input, deve andare solo a quel file di convalida (in caso di molte schermate di input in una app). Se SI, come posso ottenere un esempio/link/tutorial di quella tecnica per il mio studio di apprendimento. Se NO, perché?

Dal mio punto di vista personale, dovrebbe avere un modo per attuare la tecnica. In modo che non abbiamo bisogno di riutilizzare lo stesso codice tutto da capo per ogni file java (in termini di codice pulito). Sfortunatamente, non ho trovato alcun esempio o tutorial per questo. Forse cerco una parola chiave sbagliata o un errore di lettura. E se non esiste una tale tecnica, quali sono le migliori pratiche per la validazione dell'input?

Grazie.

p/s: questo thread per trovare un modo migliore nelle migliori pratiche. Grazie.

+0

In realtà ci sono alcune librerie già https://github.com/vekexasia/android -edittext-validator e https://github.com/thyrlian/AwesomeValidation – Neil

risposta

11

Questa classe Java implementa un TextWatcher a "guardare" la modifica del testo, guardare eventuali modifiche apportate al testo:

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); 

    @Override 
    final public void afterTextChanged(Editable s) { 
     String text = textView.getText().toString(); 
     validate(textView, text); 
    } 

    @Override 
    final public void 
    beforeTextChanged(CharSequence s, int start, int count, int after) { 
     /* Needs to be implemented, but we are not using it. */ 
    } 

    @Override 
    final public void 
    onTextChanged(CharSequence s, int start, int before, int count) { 
     /* Needs to be implemented, but we are not using it. */  
    } 
} 

E nel vostro EditText, è possibile impostare che watcher testo al suo ascoltatore

editText.addTextChangedListener(new TextValidator(editText) { 
    @Override public void validate(TextView textView, String text) { 
     /* Insert your validation rules here */ 
    } 
}); 
+0

Grazie, ottima soluzione. – sandeepmaaram

+1

Copiato da: https://stackoverflow.com/a/11838715/1112963 – Zon

5

un approccio (che sto usando) è che si dovrebbe avere un aiuto per la convalida di input come ad esempio:

  1. Nullità (o vuoto)
  2. Date
  3. password
  4. Messaggi di posta elettronica
  5. valori numerici
  6. e altri

Ecco un exerpt della mia classe ValidationHelper:

public class InputValidatorHelper { 
    public boolean isValidEmail(String string){ 
     final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 
     Pattern pattern = Pattern.compile(EMAIL_PATTERN); 
     Matcher matcher = pattern.matcher(string); 
     return matcher.matches(); 
    } 

    public boolean isValidPassword(String string, boolean allowSpecialChars){ 
     String PATTERN; 
     if(allowSpecialChars){ 
      //PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})"; 
      PATTERN = "^[[email protected]#$%]\\w{5,19}$"; 
     }else{ 
      //PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})"; 
      PATTERN = "^[a-zA-Z]\\w{5,19}$"; 
     } 



     Pattern pattern = Pattern.compile(PATTERN); 
     Matcher matcher = pattern.matcher(string); 
     return matcher.matches(); 
    } 

    public boolean isNullOrEmpty(String string){ 
     return TextUtils.isEmpty(string); 
    } 

    public boolean isNumeric(String string){ 
     return TextUtils.isDigitsOnly(string); 
    } 

    //Add more validators here if necessary 
} 

Ora il modo in cui utilizzo questa classe è questo :

InputValidatorHelper inputValidatorHelper = new InputValidatorHelper(); 
StringBuilder errMsg = new StringBuilder("Unable to save. Please fix the following errors and try again.\n"); 
//Validate and Save 
boolean allowSave = true; 
if (user.getEmail() == null && !inputValidatorHelper.isValidEmail(user_email)) { 
    errMsg.append("- Invalid email address.\n"); 
    allowSave = false; 
} 

if (inputValidatorHelper.isNullOrEmpty(user_first_name)) { 
    errMsg.append("- First name should not be empty.\n"); 
    allowSave = false; 
} 

if(allowSave){ 
    //Proceed with your save logic here 
} 

è possibile chiamare il convalida utilizzando TextWatcher che è attaccato tramite EditText#addTextChangedListener

esempio:

txtName.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     //Do nothing 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     validate(); 
    } 
}); 
+0

Esistono tipi di input speciali per Android per tutti i tipi di TextView che hai elencato.Perché hai bisogno di una validazione? – Zon