これらは私のレイアウトです:
向きが変わったときにスクロール位置を保存する必要があります。たとえば、画面に縦長モードでミドルネームから始まるレイアウトが表示されている場合、横長モードでは同じ名前から開始する必要があります。
スクロール要素にAndroid:idを設定するだけです。ビューはスクロール位置を自動的に保存します。
View.Java:15554からのコード
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
if (mID != NO_ID && (mViewFlags & SAVE_DISABLED_MASK) == 0) {
mPrivateFlags &= ~PFLAG_SAVE_STATE_CALLED;
Parcelable state = onSaveInstanceState();
if ((mPrivateFlags & PFLAG_SAVE_STATE_CALLED) == 0) {
throw new IllegalStateException(
"Derived class did not call super.onSaveInstanceState()");
}
if (state != null) {
// Log.i("View", "Freezing #" + Integer.toHexString(mID)
// + ": " + state);
container.put(mID, state);
}
}
}
電話の向きが変わったときにScrollViewのスクロール位置を保存して復元するには、次のようにします。現在の位置をonSaveInstanceStateメソッドに保存します。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntArray("ARTICLE_SCROLL_POSITION",
new int[]{ mScrollView.getScrollX(), mScrollView.getScrollY()});
}
次に、onRestoreInstanceStateメソッドで位置を復元します。これを機能させるには、RunnableをScrollViewにポストする必要があることに注意してください。
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final int[] position = savedInstanceState.getIntArray("ARTICLE_SCROLL_POSITION");
if(position != null)
mScrollView.post(new Runnable() {
public void run() {
mScrollView.scrollTo(position[0], position[1]);
}
});
}
グーグルでこのソリューションを見つけました。クレジットは元のコーダーに送られます。 :)
Samsungタブレットでは、それほど多くのコードを追加する必要はありませんでした(スーパークラスの呼び出しだけ)。また、ListViewにはすでに名前がありました。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<EditText
Android:id="@+id/search_text"
Android:maxLines="1"
Android:inputType="text"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:hint="Enter search string here" />
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="doSearch"
Android:clickable="true"
Android:text="Search"
Android:layout_toRightOf="@id/search_text"/>
<ListView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/list_of_books"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/search_text"
Android:divider="@null"
Android:orientation="vertical" />
</RelativeLayout>