vnshetty
vnshetty

Reputation: 20132

How handle EditText Change Listener in android

Imagine I have 5 EditText and I need to to populate values when one edittext value is changed. The values are interdependent. I am using the following logic to achieve that.

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

But if I click edittext a second time I get the following errors:

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)

Upvotes: 9

Views: 31022

Answers (4)

vnshetty
vnshetty

Reputation: 20132

To remove Textchangelistener

txt[i].removeTextChangedListener(watcher);

Upvotes: 0

bvanvelsen - ACA Group
bvanvelsen - ACA Group

Reputation: 1751

I had this same problem but in my case there was a different cause:

I added the textChangedListener to my EditText before I initialized the TextChangedListener

so I had this:

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

instead of:

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

Upvotes: 0

Rainbowbreeze
Rainbowbreeze

Reputation: 1503

What about storing EditText with focus and, inside the change listener, performs operation only if the view that generated the change event is equal to the one who got the focus?

Doing this, no need to attach, detach and reattach listener.

Just my 2 cents...

Upvotes: 0

Paresh Mayani
Paresh Mayani

Reputation: 128448

Instead of implementing EditTextTouchLisner, you can implement addTextChangedListener to your EditText.

addTextChangedListener takes TextWatcher object as an argument

Here is a Help With TextWatcher

Upvotes: 16

Related Questions