Cómo validar diferentes tipos de datos en Android

Hace poco hablamos de las annotations en Android y hoy os voy a explicar una librería que hace un uso excelente de ellas. En concreto hace de validación de diferentes tipos de datos. Veremos como instalarla y hacer uso de ella.

La librería la podéis encontrar en la cuenta de github del autor https://github.com/ragunathjawahar/android-saripaar y os recomiendo que echéis un vistazo al resto de sus repositorios.

Aunque en la cuenta de github tiene un enlace a un archivo .jar que podremos añadir a vuestro proyecto, https://github.com/ragunathjawahar/android-saripaar/downloads, os recomiendo que os descarguéis el proyecto y veáis como funciona.

Descargáis el .jar más reciente del enlace anterior y lo pegáis en la carpeta libs de vuestro proyecto. Si estáis en Eclipse botón derecho sobre el archivo y Add to Build Path, y en Android Studio, si no existe la carpeta libs la creáis, pegáis el archivo. En este IDE he tenido que hacer botón derecho sobre él y seleccionar Add as Library.

Una vez que tenemos lista la librería vamos a ver su uso. Voy a aprovechar el ejemplo que hice la semana pasada y que podréis encontrar actualizado en nuestra cuenta de github https://github.com/3pies/android.samples. En el voy a añadir unos cuantos EditText donde podremos insertar texto que validaremos según nos convenga. Vamos a ver como queda nuestro layout.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <TextView
            android:id="@+id/lblEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Email!" />
   
    <EditText android:id="@+id/txtEmail"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/lblEmail"
        android:layout_alignParentLeft="true"
         />

    <TextView
        android:id="@+id/lblPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtEmail"
        android:layout_alignParentLeft="true"
        android:text="Password" />
   
    <EditText android:id="@+id/txtPassword"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/lblPassword"
        android:layout_alignParentLeft="true"
        />
   
    <CheckBox android:id="@+id/chk01"
                android:text="Acepto condiciones"
              android:layout_below="@+id/txtPassword"
              android:layout_alignParentLeft="true"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
   
    <Button android:id="@+id/btn02" android:text="Continuar"
            android:layout_below="@+id/chk01"
            android:layout_alignParentLeft="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

</RelativeLayout>

Como veis no es muy complicado el formulario. Un par de cajas de texto, un checkbox y un botón para lanzar la validación. Ahora vamos a continuar en la Activity que dejamos la semana pasada y vamos a definir los widgets que necesitamos.

@ItemWidget(identifier = R.id.txtEmail, className = EditText.class)
    public EditText txtEmail;

    @ItemWidget(identifier = R.id.txtPassword, className = EditText.class)
    public EditText txtPassword;

    @ItemWidget(identifier = R.id.chk01, className = CheckBox.class)
    public CheckBox chk01;

    @ItemWidget(identifier = R.id.btn02, className = Button.class)
    public Button btn02;

Si seguisteis el ejemplo anterior sabréis que utilizamos la annotation @ItemWidget para automatizar el proceso de inicialización de widgets, y de esta forma no es necesario inicializarlo en esta Activity.

Volviendo al tema que nos interesa es momento de decirle a nuestros widgets la forma de validación que deben tener y para ello vamos a utilizar primero las annotations que nos da esta nueva librería. Veamos como cambia el código anterior:

@Required(order = 1, message = "El email es obligatorio")
    @Email(order = 2, message = "Debes introducir un email válido")
    @ItemWidget(identifier = R.id.txtEmail, className = EditText.class)
    public EditText txtEmail;

    @Required(order = 3, message = "La password es obligatoria")
    @TextRule(order =4, minLength = 6, maxLength = 20, message = "Introduce entre 6 a 20 caracteres")
    @ItemWidget(identifier = R.id.txtPassword, className = EditText.class)
    public EditText txtPassword;

    @Checked(order = 5, message = "Debes aceptar las condiciones")
    @ItemWidget(identifier = R.id.chk01, className = CheckBox.class)
    public CheckBox chk01;

    @ItemWidget(identifier = R.id.btn02, className = Button.class)
    public Button btn02;

Hemos actualizado la declaración de los widgets con las annotations necesarias para la validación. Además de estas existen otras que podréis encontrar en la cuenta de github del autor. Siguen todas una estructura muy similar, así que explicadas unas pocas, las otras no tendrán mayor dificultad.

La primera que introducimos es @Required, se encargará de verificar que se cubre un campo. Le indicamos el parámetro order para que ejecute esta y el resto de validaciones en un orden determinado. Además indicamos el mensaje de error que obtendremos de esta validación. Podríamos tener el mensaje en nuestro archivo de strings.xml y para ello podemos indicarle su id correspondiente en la propiedad messageResId.

La siguiente annotation es @Email, con los mismos parámetros que la anterior, pero en este caso validará que el valor sea un email. Para el password utilizamos @TextRule que verifica una serie de reglas como longitud mínima, máxima. Y por último @Checked que verifica si un checkbox está en estado checked.

Otras annotationes en esta librería interesantes son la de @Regex que valida si un campo cumple la estructura de una expresión regular dada.

Ahora le toca el turno a la validación. Para ello vamos por pasos. Primero debemos cambiar la declaración de nuestra Activity para que implemente los métodos de nuestra librería:

public class MainActivity extends LayoutActivity implements Validator.ValidationListener {

Después declaramos un objeto Validator que instanciaremos al inicio del onCreate:

private Validator validator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        validator = new Validator(this);
        validator.setValidationListener(this);


Además en el click de nuestro botón llamamos al método validate de validator. Así:

btn02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                validator.validate();
            }
        });

Y por último, añadimos los métodos que nos darán el resultado de la validación. Hay cuatro pero me voy a centrar en dos. onSuccess es lo que se ejecutará después de comprobar todas las validaciones y esté todo correcto. En este caso simplemente muestro un mensaje de ok, pero vosotros debéis seguir desde ahí vuestro proceso.

En el caso del onFailure, nos va a devolver el primer elemento que no se ha validado correctamente. Tenemos dos elementos de vuelta, uno es el failedView o el widget que intentó validar y falló, y el objeto Rule que es un objeto de esta librería y que en este caso utilizamos para obtener el mensaje de validación y mostrarlo al usuario.

@Override
public void preValidation() {

}

@Override
public void onSuccess() {
Toast.makeText(this, "Validado correctamente", Toast.LENGTH_LONG).show();
}

@Override
public void onFailure(View failedView, Rule failedRule) {
Log.w("onFailure", "Mensage error " + failedRule.getFailureMessage());
Log.w("onFailure", "failedView ID " + failedView.getId());
Toast.makeText(this, failedRule.getFailureMessage(), Toast.LENGTH_LONG).show();
}

@Override
public void onValidationCancelled() { }


Como veis la utilización de esta librería no tiene ninguna dificultad y puede ahorraros un montón de tiempo. Todo ello gracias a la utilización de las annotations. Si queréis ver el código completo podéis hacerlo en nuestro repositorio de github https://github.com/3pies/android.samples

Comments are closed.