2011-10-25 18 views
7

Imagine que tengo 5 EditText y necesito rellenar valores cuando se cambia un valor de edittext. Los valores son interdependientes. Estoy usando la siguiente lógica para lograr eso.Cómo manejar EditText Change Listener en android

//Finding which edit text is originating values 

for(int i=0;i<mEditTextIds.length;i++){ 
     txt[i]=(EditText) findViewById(mEditTextIds[i]); 
     txt[i].setOnTouchListener(new EditTextTouchLisner()); 
     txt[i].setId(i); 
} 


//Enable that Edittext's TextChangeListner and disabling all other Edittext's TextChangeListner .. 

if (event.getAction() == MotionEvent.ACTION_DOWN){ 
    for(int i=0;i<mTableRowIds.length;i++){ 
     if(i!=v.getId()){ 
      txt[i].addTextChangedListener(null); 
     }  
    } 
    txt[v.getId()].addTextChangedListener(new TextChangedListner()); 


//calculating values 

@Override 
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    //calculate(); 
    Toast.makeText(getApplicationContext(), "CHANGED", Toast.LENGTH_SHORT) .show(); 
} 

Pero si hago clic EditarTexto una segunda vez que tengo los siguientes errores:

10-25 16:23:05.149: ERROR/AndroidRuntime(2378): FATAL EXCEPTION: main 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378): java.lang.NullPointerException 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.widget.TextView.sendBeforeTextChanged(TextView.java:6116) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.widget.TextView.access$700(TextView.java:187) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.widget.TextView$ChangeWatcher.beforeTextChanged(TextView.java:6309) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.text.SpannableStringBuilder.sendTextWillChange(SpannableStringBuilder.java:878) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:279) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:409) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:28) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:583) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:384) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:292) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:73) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.os.Looper.loop(Looper.java:123) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at java.lang.reflect.Method.invoke(Method.java:521) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
10-25 16:23:05.149: ERROR/AndroidRuntime(2378):  at dalvik.system.NativeStart.main(Native Method) 

Respuesta

0

Para eliminar Textchangelistener

txt [i] .removeTextChangedListener (observador);

15

En lugar de implementar EditTextTouchLisner, puede implementar addTextChangedListener a su EditarTexto.

addTextChangedListener toma TextWatcher objeto como un argumento

Aquí es una Help With TextWatcher

+0

hice lo mismo (vea el segundo segmento del código) ... si al principio agrego el addTextChangedListener, entonces todos los textos chngelistner se superpondrán entre sí ¿no? ... ¿qué dices? – vnshetty

+0

@Paresh Mayani: Debía contestar igual que tú, pero tampoco me di cuenta de cómo se podría cambiar el texto 'EditText'. – Hiral

+0

@ Hiral Sí, eso es importante..Im Lográndolo por clic evento – vnshetty

0

¿Qué pasa con el almacenamiento de EditarTexto con el enfoque y, en el interior del cambio oyente, realiza la operación sólo si la opinión de que generó el evento de cambio es igual a el que obtuvo el foco?

Al hacer esto, no es necesario conectar, desconectar y volver a conectar el oyente.

Sólo mi 2 centavos ...

+0

Excelente ... pero tengo diferente diseño de interfaz de usuario ... gracias he resuelto mi problema ... – vnshetty

0

Tuve este mismo problema, pero en mi caso no fue una causa diferente:

que añade el textChangedListener a mi EditarTexto antes de la inicialización del TextChangedListener

así que tuve esto:

filterText.addTextChangedListener(filterTextWatcher); 
filterTextWatcher = new NavigationTextWatcher(adapter); 
setListAdapter(adapter); 

en lugar de:

filterTextWatcher = new NavigationTextWatcher(adapter); 
filterText.addTextChangedListener(filterTextWatcher); 
setListAdapter(adapter);