2012-06-21 43 views
79

Sé un poco acerca de TextWatcher pero eso se dispara en cada caracter que ingresa. Quiero un oyente que se active siempre que el usuario termine de editar. ¿Es posible? También en TextWatcher obtengo una instancia de Editable pero necesito una instancia de EditText. ¿Cómo lo consigo?android edittext onchange listener

EDIT: la segunda pregunta es más importante. Por favor responde eso.

+1

añadir al oyente enfoque, cuando el EDITTEXT tomar el foco , eso significa que el usuario ha comenzado a editarlo, y cuando editText pierde el foco, significa que la edición ha finalizado – Houcine

+0

https://github.com/henrychuangtw/AutoInsertEditText – HenryChuang

Respuesta

156

primero, puede ver si el usuario finalizó para editar el texto si el EditText pierde el foco o si el usuario presiona el botón listo (esto depende de su implementación y de lo que le convenga). En segundo lugar, no puede obtener una instancia EditText dentro del textwatcher solo si ha declarado el EditText como un objeto de instancia. Aunque no debe editar el EditText dentro del textwatcher porque no es seguro.

EDIT:

Para poder obtener la instancia EditarTexto en su aplicación TextWatcher usted 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 el ejemplo anterior podría tener algunos errores, pero yo sólo quería muestra un ejemplo.

1

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

Llame al onFocusChange(View v, boolean hasFocus) o agregue un botón y haga clic en escucharlo.

2

TextWatcher no funcionó para mí, ya que siguió disparando por 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 utilizando el método getChildAt(xx) se puede recuperar cualquier elemento de la ListView y obtener el elemento individual utilizando findViewById. Y luego dará el valor más reciente.

4

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()); 
    } 

}); 
8

Cualquier persona que use butterknife. Se puede utilizar como:

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

} 
7

Me molestaba que la implementación de un oyente para todos mis campos EditText requiere que yo tenga código feo, verbosa así que escribí la clase a continuación. Puede ser útil para cualquiera que tropiece 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 los incendios, uno tal vez podría implementar una verificación para ejecutar su código deseado en //Do stuff después de un determinado intentarlo

2
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 una innecesaria} al final – Howard