2011-10-25 14 views
7

Immagina di avere 5 EditText e ho bisogno di compilare i valori quando viene modificato un valore di edittext. I valori sono interdipendenti. Sto usando la seguente logica per raggiungere questo obiettivo.Come gestire EditText Cambia listener in 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(); 
} 

Ma se clicco EditText una seconda volta ottengo i seguenti errori:

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) 

risposta

0

Per rimuovere Textchangelistener

txt [i] .removeTextChangedListener (osservatore);

15

Invece di implementare EditTextTouchLisner, è possibile implementare addTextChangedListener al vostro EditText.

addTextChangedListener prende TextWatcher oggetto come argomento

Qui è un Help With TextWatcher

+0

ho fatto la stessa cosa (vedi il secondo segmento di codice) ... se aggiungo intenzionalmente l'addTextChangedListener allora tutti i testi di chngelistner si sovrapporranno l'un l'altro no? .. cosa dici? – vnshetty

+0

@Paresh Mayani: dovevo rispondere come hai fatto tu, ma anche io non l'ho capito, come sarebbe stato in grado di sapere quale "EditText" è stato modificato. – Hiral

+0

@ Hiral Sì, è importante ... realizzandolo per evento click – vnshetty

0

cosa circa memorizzazione EditText con messa a fuoco e, all'interno del cambiamento ascoltatore, esegue l'operazione solo se la vista che ha generato l'evento variazione è pari a colui che ha il focus?

In questo modo, non è necessario collegare, scollegare e ricollegare l'ascoltatore.

Solo i miei 2 cents ...

+0

Eccellente ... ma ho un design dell'interfaccia diverso .. grazie ho risolto il mio problema ... – vnshetty

0

Ho avuto questo stesso problema, ma nel mio caso c'è stata una causa diversa:

ho aggiunto il textChangedListener al mio EditText prima inizializzato il TextChangedListener

così ho avuto questa:

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

anziché:

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