Android edittext onchange oyente


115

Sé un poco sobre TextWatchereso, pero eso se activa con cada personaje que ingresas. Quiero un oyente que se active cada vez que el usuario termine de editar. ¿Es posible? También en TextWatcherobtengo una instancia de Editablepero necesito una instancia de EditText. ¿Cómo consigo eso?

EDITAR : la segunda pregunta es más importante. Por favor responda eso.


1
intente agregar el oyente de enfoque, cuando editText toma el enfoque, eso significa que el usuario ha comenzado a editarlo, y cuando editText pierde el enfoque, significa que la edición ha terminado
Houcine

Respuestas:


214

Primero, puede ver si el usuario terminó de editar el texto si EditTextpierde el foco o si el usuario presiona el botón de listo (esto depende de su implementación y de lo que se ajuste mejor a usted). En segundo lugar, no puede obtener una EditTextinstancia dentro de TextWatchersolo si ha declarado EditTextcomo objeto de instancia. Aunque no debería editar el contenido EditTextdentro de la TextWatcherporque no es seguro.

EDITAR:

Para poder incluir la EditTextinstancia en su TextWatcherimplementación, debe intentar algo como esto:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }
}

Tenga en cuenta que la muestra anterior puede tener algunos errores, pero solo quería mostrarle un ejemplo.


17

Me molestaba que la implementación de un oyente para todos mis campos EditText requiriera que tuviera un código feo y detallado, así que escribí la siguiente clase. Puede ser útil para cualquiera que se encuentre con esto.

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

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

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

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

Ahora implementar un oyente es un poco más limpio.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

En cuanto a la frecuencia con la que se activa, tal vez se podría implementar una verificación para ejecutar el código deseado //Do stuffdespués de un determinado


Esto funciona muy bien para mí, ¡ahorra muchas líneas de código! ¡Eres un genio!
huypham99

12

Cualquiera que use ButterKnife . Puedes usar como:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}

6

Lo he hecho usando AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});

3
 myTextBox.addTextChangedListener(new TextWatcher() {  

    public void afterTextChanged(Editable s) {}  

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    public void onTextChanged(CharSequence s, int start, int before, int count) {  

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

2
Hay uno innecesario} al final
Howard

2

TextWatcher no funcionó para mí, ya que siguió disparando para cada EditText y arruinando los valores de los demás.

Aquí está mi solución:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

Por lo tanto, al usar el getChildAt(xx)método, puede recuperar cualquier elemento del ListViewy obtener el elemento individual usando findViewById. Y luego dará el valor más reciente.


1

Por lo que puedo pensar, solo hay dos formas de hacerlo. ¿Cómo puede saber que el usuario ha terminado de escribir una palabra? Ya sea en el foco perdido o haciendo clic en un botón "Aceptar". No hay forma en mi mente de que puedas saber que el usuario presionó el último carácter ...

Así que llame onFocusChange(View v, boolean hasFocus)o agregue un botón y un oyente de clics.


0

El método Watcher se activa con cada entrada de carácter. Entonces, construí este código basado en el método onFocusChange:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

Para usarlo, simplemente llame así:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

Puede ignorar la función comS reemplazando! ComS (dat.s, "" + EdTe.getText ()) con la función! Equal. Sin embargo, la función de igual en sí misma en algún momento no funciona correctamente en tiempo de ejecución.

El oyente de onChange recordará los datos antiguos de EditText cuando el usuario se concentre en escribir, y luego comparará los nuevos datos cuando el usuario pierda el foco o salte a otra entrada. Si se compara la cadena antigua no es la misma cadena nueva, se activa el trabajo.

Si solo tiene 1 EditText, entonces tendrá que hacer una función ClearFocus creando un Ultimate Secret Transparente Micro EditText 😸 fuera de las ventanas 😽 y solicite el foco, luego oculte el teclado mediante Import Method Manager.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.