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.
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ó.