android - How to restore fragment state after resume w/o savedInstanceState? -


in app fragmentactivity contains simple listfragment , want preserve position user has scrolled to. did following:

private int initialscrollposition = 0; private int initialscrollyoffset = 0;  @override public void onsaveinstancestate (bundle outstate) {     outstate.putint(scroll_position, this.getlistview().getfirstvisibleposition());     view firstvisibleitemview = this.getlistview().getchildat(0);     outstate.putint(scroll_y_offset, (firstvisibleitemview == null) ? 0 : firstvisibleitemview.gettop()); }  @override public void onactivitycreated (bundle savedinstancestate) {     super.onactivitycreated(savedinstancestate);     this.restorestate(savedinstancestate); }  private void restorestate(bundle savedinstancestate) {     if(savedinstancestate != null             && savedinstancestate.containskey(scroll_position)) {         this.initialscrollposition = savedinstancestate.getint(scroll_position);     }     if(savedinstancestate != null             && savedinstancestate.containskey(scroll_y_offset)) {         this.initialscrollyoffset = savedinstancestate.getint(scroll_y_offset);     } }  @override public void onstart () {     super.onstart();     // other gui stuff     this.getlistview().setselectionfromtop(this.initialscrollposition, this.initialscrollyoffset); } 

this solution works fine things display orientation changes or moving 1 activity of app next.

but if fire app, scroll bit, go home, , restore app recents, onactivitycreated (or other callbacks savedinstancestate bundle) not called , therefore state cannot restored.

therefore have 2 questions:

  1. what can savedinstancestate after resuming without onxxxcreated callbacks?
  2. what lifecycle doing there. i'd understand, why approach fails.

thank insight!

solution:

thx andré! changed onsaveinstancestate this:

@override public void onsaveinstancestate (bundle outstate) {     this.initialscrollposition = this.getlistview().getfirstvisibleposition();     view firstvisibleitemview = this.getlistview().getchildat(0);     this.initialscrollyoffset = (firstvisibleitemview == null) ? 0 : firstvisibleitemview.gettop();     outstate.putint(scroll_position, this.initialscrollposition);     outstate.putint(scroll_y_offset, this.initialscrollyoffset); } 

if app brought front using recent apps button, might isn't recreated, because system didn't finish yet. in case onresume() , following callbacks invoked.

conclusion: try restore position in onresume(), store positions in onpause() (for recent app switches activity isn't recreated), extract positions savedinstancestate bundle (for orientation change activity recreated).


Comments

Popular posts from this blog

monitor web browser programmatically in Android? -

Shrink a YouTube video to responsive width -

wpf - PdfWriter.GetInstance throws System.NullReferenceException -