es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enmascaramiento de texto con guiones

Quiero crear una máscara con EditText, el objetivo es tener cuatro (4) guiones al principio y cuando el usuario escriba, cada guion será reemplazado por la entrada del usuario. Estoy pensando en usar splice y replace, pero tengo dificultades para manejar correctamente el retroceso para eliminar las entradas. ¿Cuál es el mejor enfoque para esto?

Así es cómo debería verse:
sample

Ahora, el número de entradas no se limita a cuatro (4) caracteres, ya que tiene un máximo de 50 caracteres. Para demostrarlo, debería verse así:

Por ejemplo:
1. A – – –
2. A B – –
3. A B C –
4. A B C D
5. A B C D E y así sucesivamente.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear una máscara con EditText como se describe, puedes utilizar la biblioteca android-textinputedittext. Aquí tienes cómo puedes lograrlo:

    1. Configura el atributo android:maxLength en tu EditText a 50 (o cualquier longitud máxima deseada).
    2. Establece un TextWatcher en tu EditText para escuchar los cambios en la entrada. Aquí tienes un ejemplo:
      editText.addTextChangedListener(object : TextWatcher {
         override fun afterTextChanged(s: Editable?) {
             // Implementa el manejo de los cambios de entrada aquí
         }
      
         override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
      
         override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
      })
      
    3. Implementa el método afterTextChanged para actualizar la máscara de entrada. Puedes utilizar el método splice para insertar la entrada del usuario en las posiciones adecuadas. Aquí tienes un ejemplo:
      override fun afterTextChanged(s: Editable?) {
         val input = s.toString().replace("-", "") // Elimina los guiones de la entrada
      
         // Inserta la entrada del usuario en las posiciones adecuadas de la máscara
         val maskedInput = when (input.length) {
             in 0..3 -> input.splice(0, 0, "-", "-", "-", "-")
             in 4..6 -> input.splice(0, 0, "-", "-", "-").splice(4, 0, "-")
             in 7..9 -> input.splice(0, 0, "-", "-").splice(3, 0, "-").splice(7, 0, "-")
             in 10..50 -> input.splice(0, 0, "-").splice(2, 0, "-").splice(5, 0, "-").splice(9, 0, "-")
             else -> ""
         }
      
         // Actualiza el EditText con la entrada enmascarada
         editText.setText(maskedInput)
         editText.setSelection(maskedInput.length)
      }
      
    4. Maneja la tecla de retroceso para que el usuario pueda eliminar la entrada. Aquí tienes un ejemplo:
      override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
         if (keyCode == KeyEvent.KEYCODE_DEL) {
             val selectionStart = editText.selectionStart
      
             // Si el usuario está al comienzo de un bloque, elimina el bloque
             when (selectionStart) {
                 10, 7, 4, 1 -> editText.setSelection(selectionStart - 1)
             }
      
             return false
         }
      
         return super.onKeyDown(keyCode, event)
      }
      

    Con estos pasos, puedes crear una máscara con EditText que permita al usuario introducir hasta 50 caracteres con cuatro (4) guiones al principio, y con manejo adecuado de la tecla de retroceso para eliminar la entrada.

Comments are closed.