2010-02-10 72 views
1

我在保存方向更改期间Android的WebView控件中加载的内容的当前滚动位置时存在问题。在Android 2.1的方向更改期间保存WebView滚动位置的问题

@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和:这个问题目前仅在Android 2.1及Android 2.1的更新1

,我使用的是基于默认的浏览器应用程序,看起来像这样的代码存在2.0.1。在Android 2.1中,相同的代码恢复了分秒的位置,但页面重新加载并滚动到位置0,0。

在Android 2.1的更新1,它不仅向后滚动到0,0,而且还改变了缩放到适合页面宽度(类似于2.1引入了浏览器概述模式)

有谁知道的解决方法或有任何想法可能会导致此类行为?

+0

您是否尝试过比较两个版本之间的WebView源代码,看看有哪些变化?可能会给出线索,发生什么事情.. – 2010-02-11 01:27:18

+0

我确实尝试过比较来源。在1.6和2.0之间有很大的变化(包括添加概览模式)。除非您真的了解WebView的内部工作原理,否则很难弄清究竟是什么导致了这种行为变化。更令人沮丧的是,我甚至无法通过我拥有的源代码进行调试,因为我没有与它运行的模拟器或设备匹配的源的确切版本。 – StefanK 2010-02-11 21:26:04

+0

这可以解决方向更改的问题,但不适用于离开活动并稍后返回的用户。看来,该位置没有正确存储在Bundle中 - 或者该值被忽略。 – ge0rg 2011-09-26 14:11:24

回答

0

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

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

in activity tab。谢谢

3

只需在onRestoreInstanceState中加载WebViewState。

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