Solamente permitir escribir un correo electrónico en EditText

publicado por: Anonymous

He hecho este código para intentar que en EditTextEmail solamente se pueda escribir un correo electrónico si se escribe algo que no sea un correo electrónico mande un Toast

    EditText EditTextEmail;
    Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = (Button) findViewById(R.id.btn1);

        EditTextEmail = (EditText) findViewById(R.id.EditTextEmail);
        final String compruebaemail = EditTextEmail.getEditableText().toString().trim();


        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!compruebaemail.matches("[a-zA-Z0-9._-][email protected][a-z]+.[a-z]+"))
                {
                Toast.makeText(MainActivity.this, "Por favor, introduce bien su email", Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

El problema es básicamente que escriba lo que escriba mi manda el Toast como si estuviese mal escribo.

Ejemplo de texto con el que falla:

[email protected]

solución

La variable compruebaemail está siendo asignada en onCreate, antes de que ingreses el texto.

En cambio si se asigna dentro del evento onClick, recién ahí tendrá el último valor ingresado.

btn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final String compruebaemail = EditTextEmail.getEditableText().toString().trim();

        final String regex = "(?:[^<>()\[\].,;:\[email protected]"]+(?:\.[^<>()\[\].,;:\[email protected]"]+)*|"[^\n"]+")@(?:[^<>()\[\].,;:\[email protected]"]+\.)+[^<>()\[\]\.,;:\[email protected]"]{2,63}";

        if (!compruebaemail.matches(regex))
        {
            Toast.makeText(MainActivity.this, "Por favor, introduce bien su email", Toast.LENGTH_LONG).show();
        }
    }
});

Nótese que opté por otra expresión regular, tomada de la respuesta a mi pregunta: Validar un email en JavaScript.

El problema que podía tener la expresión regular que estabas utilizando era que:

  • había que escapar el punto (sino coincide con cualquier caracter)

  • había que permitir más de 1 punto (ejemplo [email protected])

  • posiblemente permitir mayúsculas en el dominio (ya que sólo estabas permitiendo [a-z], y las expresiones regulares diferencian mayúsculas/minúsculas por omisión)

  • y permitir otros caracteres, válidos en cualquier e-mail (ejemplo: +).

El regex que utilicé, no válida absolutamente todos los mails válidos, pero en mi opinión te servirá para la mayoría de los casos. De hecho, si realmente se aceptarán todos los casos válidos según el RFC, estarías aceptando “aberraciones” que normalmente uno no quiere aceptar en un formulario. De todas formas, la validación de e-mail es un tema demasiado amplio que ya se escapa del alcance de esta pregunta.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *