Это мой макет:
Мне нужно сохранить положение прокрутки при изменении ориентации. например, если на экране отображается макет, начиная со среднего имени в портретном режиме, он должен начинаться с того же в ландшафтном режиме.
Это мой макет:
Мне нужно сохранить положение прокрутки при изменении ориентации. например, если на экране отображается макет, начиная со среднего имени в портретном режиме, он должен начинаться с того же в ландшафтном режиме.
Вы Если ваша деятельность ничего не меняет в ротации, вы можете использовать android: configChanges = "direction | keyboardHidden | screenSize" в файле манифеста в рамках этого конкретного действия. Но это явно обходной путь, а не правильное решение.
Примечание:
Если вам нужно использовать разные виды для ландшафта и портретов или если вам нужно использовать разные виды для разных устройств, следует использовать связку и сохранять данные в состоянии сохранения и извлекать данные в режиме создания. Этот метод останавливает воссоздание действия, и действие предполагает, что все будет обрабатываться самим пользователем.
Просто установите 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]);
}
});
}
Нашел это решение в Google. Кредит отправляется в Original Coder.:)
На моем планшете 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>
отсылайте их, чтобы сохранить положение прокрутки и прокручивать после изменения ориентации.
Сделайте это в манифесте.
<activity
android:name=".YourActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name" >
</activity>