在 Android 2.1 中方向更改期间保存 WebView 滚动位置的问题

Posted

技术标签:

【中文标题】在 Android 2.1 中方向更改期间保存 WebView 滚动位置的问题【英文标题】:Problem saving WebView scroll position during orientation change in Android 2.1 【发布时间】:2011-01-15 12:09:51 【问题描述】:

在方向更改期间,我在保留加载到 android 的 WebView 控件中的内容的当前滚动位置时遇到问题。该问题目前仅存在于 Android 2.1 和 Android 2.1 Update 1

我使用的代码基于默认的浏览器应用程序,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState)

  super.onCreate(savedInstanceState);
  mWebView = new WebView(this);
  setContentView(mWebView);
  mWebView.setWebViewClient(mWebViewClient);

  if (savedInstanceState != null)
  
    final WebBackForwardList list = mWebView.restoreState(savedInstanceState);
    if (list == null)
      return;

    if (savedInstanceState.containsKey("currentPicture"))
    
       final File f = new File(savedInstanceState.getString("currentPicture"));
       mWebView.restorePicture(savedInstanceState, f);
       f.delete();
    
  else
    mWebView.loadUrl("http://slashdot.org/");
 

 @Override
 protected void onSaveInstanceState(Bundle outState)
 
   final WebBackForwardList list = mWebView.saveState(outState);
   File mThumbnailDir = getDir("thumbnails", 0);
   if (list != null)
   
     final File f = new File(mThumbnailDir, mWebView.hashCode() + "_pic.save");
     if (mWebView.savePicture(outState, f))
        outState.putString("currentPicture", f.getPath());
   
 

此代码适用于 Android 1.5、1.6 和 2.0.1。在 Android 2.1 中,相同的代码会在一瞬间恢复位置,但随后页面会重新加载并滚动到位置 0,0。

在Android 2.1 Update 1中,它不仅滚动回0,0,还改变Zoom以适应页面宽度(类似于2.1中引入的浏览器Overview模式)

是否有人知道解决方法或知道可能导致此类行为的原因?

【问题讨论】:

你试过比较两个版本的WebView的来源,看看有什么变化?可能会提供有关发生了什么的线索.. 我确实尝试过比较来源。 1.6 和 2.0 之间有相当多的变化(包括添加概览模式)。除非您真的了解 WebView 的工作原理,否则很难弄清楚究竟是什么导致了这种行为变化。更令人沮丧的是,我什至无法通过我拥有的源进行调试,因为我没有与模拟器或它运行的设备匹配的源的确切版本。 这可以解决方向更改,但不适用于用户离开活动并稍后返回。看来,该位置未正确存储在 Bundle 中 - 或者该值被忽略。 【参考方案1】:

只需在 onRestoreInstanceState 中加载 WebViewState。

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) 
    super.onRestoreInstanceState(savedInstanceState);
    myWebView.restoreState(savedInstanceState);

【讨论】:

【参考方案2】:

将方向从横向更改为纵向或反之亦然,它会启动新活动。因此,您将打开为刷新的活动。 将代码放入您的 AndroidManifest.xml 并重新加载应用程序。

 "activity android:name=".Main
 android:configChanges="orientation"

在活动选项卡中。谢谢

【讨论】:

以上是关于在 Android 2.1 中方向更改期间保存 WebView 滚动位置的问题的主要内容,如果未能解决你的问题,请参考以下文章

Android在方向上保存视图位置已更改[重复]

保存图像后由于方向更改导致 Android 显示图像捕获错误

即使 autoRotation 关闭,也能获取 android 设备方向

最佳实践:方向更改期间的 AsyncTask

Android - 在活动重新创建期间是不是保留了意图?

为不同方向使用不同布局时,在方向更改时保存片段状态