私のアプリFragmentActivity
には単純なものが含まれてListFragment
おり、ユーザーがスクロールした位置を保持したいと考えています。私は次のことをしました:
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();
// some other GUI stuff
this.getListView().setSelectionFromTop(this.initialScrollPosition, this.initialScrollYOffset);
}
このソリューションは、ディスプレイの向きの変更や、あるアプリから次のアプリへの移動などに対してうまく機能しますActivity
。
しかし、アプリを起動し、少しスクロールしてホームに戻り、Recents からアプリを復元するとonActivityCreated
(または を含むその他のコールバックsavedInstanceState
Bundle
) が呼び出されないため、状態を復元できません。
したがって、私は2つの質問があります:
- コールバック
savedInstanceState
なしで再開した後に取得するにはどうすればよいですか?onXXXCreated
- ライフサイクルがそこで何をしているのか。私のアプローチが失敗する理由を理解したいです。
洞察をありがとうございました!
解決:
アンドレに感謝!私はこれに変更onSaveInstanceState
しました:
@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);
}