Saltar al contenido

Cómo enmascarar un EditText para mostrar el formato de fecha dd / mm / aaaa

Posterior a de nuestra prolongada selección de datos pudimos resolver este disgusto que tienen muchos lectores. Te regalamos la respuesta y esperamos que te resulte de gran ayuda.

Solución:

yo escribí esto TextWatcher para un proyecto, espero que sea de ayuda para alguien. Tenga en cuenta que lo hace no valide la fecha ingresada por el usuario, y debe manejar eso cuando cambie el enfoque, ya que es posible que el usuario no haya terminado de ingresar la fecha.

Actualización 25/06 Lo convertimos en un wiki para ver si llegamos a un código final mejor.

Actualización 07/06
Finalmente agregué algún tipo de validación al observador mismo. Hará lo siguiente con fechas inválidas:

  • Si el mes es mayor que 12, será el 12 (diciembre)
  • Si la fecha es mayor que la del mes seleccionado, conviértalo en el máximo para ese mes.
  • Si el año no está en el rango 1900-2100, cámbialo para que esté en el rango

Esta validación se ajusta a mis necesidades, pero es posible que algunos de ustedes quieran cambiarla un poco, los rangos se pueden cambiar fácilmente y podrían conectar estas validaciones a Toast mensaje, por ejemplo, para notificar al usuario que hemos modificado su fecha porque no era válida.

En este código, asumiré que tenemos una referencia a nuestro EditText llamado date que tiene esto TextWatcher adjunto a él, esto se puede hacer algo como esto:

EditText date;
date = (EditText)findViewById(R.id.whichdate);
date.addTextChangedListener(tw);

TextWatcher tw = new TextWatcher() 
    private String current = "";
    private String ddmmyyyy = "DDMMYYYY";
    private Calendar cal = Calendar.getInstance();

Cuando el usuario cambia el texto del EditText

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) 
        if (!s.toString().equals(current)) \.", "");
            String cleanC = current.replaceAll("[^\d.]
    

También implementamos las otras dos funciones porque tenemos que

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 

    @Override
    public void afterTextChanged(Editable s) 
;

Esto produce el siguiente efecto, donde la eliminación o inserción de caracteres revelará u ocultará la dd/mm/yyyy máscara. Debería ser fácil de modificar para adaptarse a otras máscaras de formato, ya que intenté dejar el código lo más simple posible.

ingrese la descripción de la imagen aquí

La respuesta actual es muy buena y me ayudó a orientarme hacia mi propia solución. Hay algunas razones por las que decidí publicar mi propia solución a pesar de que esta pregunta ya tiene una respuesta válida:

  • Estoy trabajando en Kotlin, no en Java. Las personas que se encuentren con el mismo problema deberán traducir la solución actual.
  • Quería escribir una respuesta que fuera más legible para que la gente pudiera adaptarla más fácilmente a sus propios problemas.
  • Como sugirió dengue8830, encapsulé la solución a este problema en una clase, para que cualquiera pueda usarla sin siquiera preocuparse por la implementación.

Para usarlo, simplemente haga algo como:

  • FechaInputMask (mEditText) .listen ()

Y la solución se muestra a continuación:

class DateInputMask(val input : EditText) 

    fun listen() 
        input.addTextChangedListener(mDateEntryWatcher)
    

    private val mDateEntryWatcher = object : TextWatcher 

        var edited = false
        val dividerCharacter = "/"

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) 
            if (edited) 
                edited = false
                return
            

            var working = getEditText()

            working = manageDateDivider(working, 2, start, before)
            working = manageDateDivider(working, 5, start, before)

            edited = true
            input.setText(working)
            input.setSelection(input.text.length)
        

        private fun manageDateDivider(working: String, position : Int, start: Int, before: Int) : String
            if (working.length == position) 
                return if (before <= position && start < position)
                    working + dividerCharacter
                else
                    working.dropLast(1)
            
            return working
        

        private fun getEditText() : String 
            return if (input.text.length >= 10)
                input.text.toString().substring(0,10)
            else
                input.text.toString()
        

        override fun afterTextChanged(s: Editable) 
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) 
    

una forma más limpia de usar el código de Juan Cortés es ponerlo en una clase:

public class DateInputMask implements TextWatcher 

private String current = "";
private String ddmmyyyy = "DDMMYYYY";
private Calendar cal = Calendar.getInstance();
private EditText input;

public DateInputMask(EditText input) 
    this.input = input;
    this.input.addTextChangedListener(this);


@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) 



@Override
public void onTextChanged(CharSequence s, int start, int before, int count) 
    if (s.toString().equals(current)) 
        return;
    

    String clean = s.toString().replaceAll("[^\d.]

@Override
public void afterTextChanged(Editable s) 



entonces puedes reutilizarlo

new DateInputMask(myEditTextInstance);

No se te olvide mostrar este ensayo si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *