方向更改时保存scrollview的位置

15 android orientation android-layout

这些是我的布局:

细节布局

我需要在方向改变时保存滚动位置.例如,如果屏幕在纵向模式下显示从中间名开始的布局,则应在横向模式下从相同的位置开始.

小智 39

只需在滚动元素上设置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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该标记为正确答案.虽然从View.java发布代码在这种情况下有点令人困惑. (4认同)
  • 好答案!我认为这是滚动视图无法恢复其位置的最常见原因 (2认同)
  • 当在 `NestedScrollView` 中有一个 `RecyclerView` 时,这对我不起作用,但下面 Umesh Clauhan 的解决方案有效。 (2认同)

Ume*_*han 36

要在手机方向更改时保存和恢复ScrollView的滚动位置,您可以执行以下操作:在onSaveInstanceState方法中保存当前位置:

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putIntArray("ARTICLE_SCROLL_POSITION",
            new int[]{ mScrollView.getScrollX(), mScrollView.getScrollY()});
}
Run Code Online (Sandbox Code Playgroud)

然后恢复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]);
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

在谷歌上找到这个解决方案.归功于Original Coder.:)

  • 这不是必需的,您只需要在ScrollView上设置ID(参见实际答案......) (8认同)

MrD*_*umb -15

如果您的活动没有在轮换中更改任何内容,您可以在此特定活动的清单文件中使用 android:configChanges="orientation|keyboardHidden|screenSize" 。但这显然是一种解决方法,而不是一个正确的解决方案。

笔记:

如果您需要对横向和纵向使用不同的视图,或者需要对不同的设备使用不同的视图,则应该使用捆绑并在 saveinstancestate 上保存数据并在 oncreate 中检索数据。此方法停止重新创建活动,并且活动假设事情将由用户自己处理。