Contando caracteres en el escucha modificado de EditText

272

En mi proyecto tengo un EditText. Quiero contar los caracteres en el EditTexty mostrar ese número en a TextView. He escrito el siguiente código y funciona bien. Sin embargo, mi problema es que cuando hago clic Backspacecuenta, pero necesito disminuir el número. ¿Cómo puedo considerarlo Backspace?

tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        i++;
        tv.setText(String.valueOf(i) + " / " + String.valueOf(charCounts));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 
Hesam
fuente
36
Perdone la irrelevancia, pero tengo curiosidad por saber cómo colocó el "espacio de retroceso" en el formato de su pregunta. He hecho preguntas similares donde esa técnica hubiera sido muy útil.
AlleyOOP
59
Coloque su palabra (en este caso, Retroceso) entre etiquetas <kbd> </kbd> como: <kbd> Retroceso </kbd>
Hesam
2
Siempre que vea un formato interesante (como "retroceso"), siempre puede hacer clic en el enlace "editar" para ver cómo lo hizo el autor. Luego simplemente haga clic en "cancelar" para descartar su edición.
Suragch

Respuestas:

142

Utilizar

s.length()

Lo siguiente se sugirió una vez en una de las respuestas, pero es muy ineficiente

textMessage.getText().toString().length()
xtempore
fuente
38

¿qué tal simplemente obtener la longitud de char en su EditText y mostrarlo?

algo en la línea de

tv.setText(s.length() + " / " + String.valueOf(charCounts));
Andreas Wong
fuente
66
Es incluso más fácil que eso: solo puede llamar textMessage.length(), sin necesidad de hacerlo getText().toString(). developer.android.com/reference/android/widget/…
Yoni Samlan
28

Unos pocos cambios en su código:

TextView tv = (TextView)findViewById(R.id.charCounts);
textMessage = (EditText)findViewById(R.id.textMessage);
textMessage.addTextChangedListener(new TextWatcher(){
    public void afterTextChanged(Editable s) {
        tv.setText(String.valueOf(s.toString().length()));
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}
    public void onTextChanged(CharSequence s, int start, int before, int count){}
}); 
KKumar
fuente
1
Esto no funcionará como está escrito - length () devuelve un int y setText espera una Cadena
Martin Lockett
1
@MartinLockett usa Integer.toString (int_type) para convertir una cadena a int.
Mehdi Rostami
6

Esta es una respuesta un poco más general con más explicaciones para futuros espectadores.

Agregar un oyente cambiado de texto

Si desea encontrar la longitud del texto o hacer otra cosa después de que se haya cambiado el texto, puede agregar un oyente con texto modificado a su texto de edición.

EditText editText = (EditText) findViewById(R.id.testEditText);
editText.addTextChangedListener(new TextWatcher() {

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

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int start, int before, int count)  {

    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
});

El oyente necesita una TextWatcher, que requiere tres métodos para ser anulado: beforeTextChanged, onTextChanged, y afterTextChanged.

Contando los personajes

Puedes hacer que el personaje cuente en onTextChangedo beforeTextChangedcon

charSequence.length()

o afterTextChangedcon

editable.length()

Significado de los métodos

Los parámetros son un poco confusos, así que aquí hay una pequeña explicación adicional.

beforeTextChanged

beforeTextChanged(CharSequence charSequence, int start, int count, int after)

  • charSequence: Este es el contenido del texto antes de que se realice el cambio pendiente. No deberías intentar cambiarlo.
  • start: Este es el índice de dónde se insertará el nuevo texto. Si se selecciona un rango, entonces es el índice inicial del rango.
  • count: Esta es la longitud del texto seleccionado que se va a reemplazar. Si no se selecciona nada, countlo será 0.
  • after: esta es la longitud del texto a insertar.

onTextChanged

onTextChanged(CharSequence charSequence, int start, int before, int count)

  • charSequence: Este es el contenido del texto después de que se realizó el cambio. No debe intentar modificar este valor aquí. Modifique el editablein afterTextChangedsi es necesario.
  • start: Este es el índice del inicio de dónde se insertó el nuevo texto.
  • before: Este es el viejo valor. Es la longitud del texto previamente seleccionado que fue reemplazado. Este es el mismo valor que counten beforeTextChanged.
  • count: Esta es la longitud del texto que se insertó. Este es el mismo valor que afteren beforeTextChanged.

afterTextChanged

afterTextChanged(Editable editable)

Al igual onTextChanged, esto se llama después de que el cambio ya se haya realizado. Sin embargo, ahora el texto puede ser modificado.

  • editable: Este es el texto editable de EditText. Sin embargo, si lo cambia, debe tener cuidado de no entrar en un bucle infinito. Consulte la documentación para más detalles.

Imagen suplementaria de esta respuesta

ingrese la descripción de la imagen aquí

Suragch
fuente
0

TextWatcher maritalStatusTextWatcher = new TextWatcher () {@Override public void beforeTextChanged (CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        try {
            if (charSequence.length()==0){
                topMaritalStatus.setVisibility(View.GONE);
            }else{
                topMaritalStatus.setVisibility(View.VISIBLE);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {

    }
};
Chandan Bera
fuente