android - onTextChanged() method called without calling setText() or user's typing -


textwatcher works fine until activity destroyed , before restoring old saved bundle. when restore saved bundle ontextchanged() called both of edittexts. happens if don't restore values (don't call settext()). note user not interacting in way.

code :

@override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.create_trip);     log.d(tag, "oncreate");      fromlocation = (edittext) findviewbyid(r.id.from_location);     tolocation = (edittext) findviewbyid(r.id.to_location);      // set edittexts listeners     setfromlocationedittextlisteres();     settolocationedittextlisteres();      // check whether we're recreating destroyed instance     if (savedinstancestate != null) {          log.d(tag, "restoring state saved bundle");         ...      } else {         log.e(tag, "setting default values");         ...      } }   // set listener fromlocation edittext private void setfromlocationedittextlisteres() {      fromlocation.setonfocuschangelistener(new onfocuschangelistener() {         @override         public void onfocuschange(view v, boolean hasfocus) {             if (hasfocus) {                  log.d(tag, "fromlocation gained focus.");              }         }     });      fromlocation.addtextchangedlistener(new textwatcher() {         @override         public void aftertextchanged(editable s) {             log.e(tag, "fromlocation after.");         }          @override         public void beforetextchanged(charsequence s, int start, int count,                 int after) {          }          @override         public void ontextchanged(charsequence s, int start, int before,                 int count) {              if (fromlocation == null) {                 log.d(tag, "fromlocation null................");             }              if (count != before) {                 edittextvaluechanged(fromlocation);             }         }     });      fromlocation.setonkeylistener(new view.onkeylistener() {          public boolean onkey(view v, int keycode, keyevent event) {              // if user pressed enter             if (keycode == keyevent.keycode_enter) {              }              // if pressed other enter key let others handle             // event             return false;         }     }); }  // set listener tolocation edittext private void settolocationedittextlisteres() {      tolocation.setonfocuschangelistener(new onfocuschangelistener() {         @override         public void onfocuschange(view v, boolean hasfocus) {             if (hasfocus) {                  log.d(tag, "tolocation gained focus.");             }         }     });      tolocation.addtextchangedlistener(new textwatcher() {         @override         public void aftertextchanged(editable s) {             log.e(tag, "tolocation after.");         }          @override         public void beforetextchanged(charsequence s, int start, int count,                 int after) {         }          @override         public void ontextchanged(charsequence s, int start, int before,                 int count) {              if (count != before) {                 edittextvaluechanged(tolocation);             }         }     });      tolocation.setonkeylistener(new view.onkeylistener() {          public boolean onkey(view v, int keycode, keyevent event) {              // if user pressed enter             if (keycode == keyevent.keycode_enter) {              }              // if pressed other enter key let others handle             // event             return false;         }     });  }  @override public void onsaveinstancestate(bundle savedinstancestate) {      log.e(tag, "onsaveinstancestate called.");      // save activity state     savedinstancestate.putcharsequence(from_location_text,             fromlocation.gettext());     savedinstancestate.putcharsequence(to_location_text,             tolocation.gettext());     super.onsaveinstancestate(savedinstancestate); } 

after headache of few hours reason of issue comes out following code :

@override public void onsaveinstancestate(bundle savedinstancestate) {      log.e(tag, "onsaveinstancestate called.");      // save activity state     savedinstancestate.putcharsequence(from_location_text,             fromlocation.gettext());     savedinstancestate.putcharsequence(to_location_text,             tolocation.gettext());     super.onsaveinstancestate(savedinstancestate); } 

what happens android stores edittext's state (if id attribute specified in layout file) , when activity restored using saved bundle restores edittext's value calling myedittext.settext(). triggering call text changed listeners.

solution removing lines above code saves edittext's text. not save edittext or similar view's state explicitly. let android you.


Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -