屏幕旋转时如何保存WebView状态

5

我正在制作自己的浏览器,需要帮助。我试图保存它的状态。我尝试了以下方法,但并非我要寻找的解决方案。

我尝试了这个:

<activity android:name=".About"
    android:configChanges="orientation|keyboard|screenSize" />

但问题是工具栏没有被调整大小,因此标题太小,工具栏高度最小(如果我从横向开始旋转到竖向),标题太大并且高度更大(如果我从竖向开始旋转到横向)。我尝试的其他方法有:
@Override
public void onCreate(final Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.blah);
   if (savedInstanceState != null)
      ((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState.getBundle("webViewState");
}

@Override
protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      Bundle bundle = new Bundle();
      webView.saveState(bundle);
      outState.putBundle("webViewState", bundle);
}

但是WebView没有被正确保存。

我该怎么做才能在旋转时保存webview状态,并且不会遇到工具栏大小的问题?

也许最好是处理配置更改并尝试调整工具栏和文本的大小?


1
我没有找到这篇文章。我会去看看。 - hegocre
4个回答

5

您应该将Webview状态保存到其自己的Bundle中。同时,不要忘记调用super.onSaveInstanceState(outState)

@Override
public void onCreate(final Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.blah);
   if (savedInstanceState != null)
      ((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState.getBundle("webViewState"));
}

@Override
protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      Bundle bundle = new Bundle();
      webView.saveState(bundle);
      outState.putBundle("webViewState", bundle);
}

1
这不会保存JavaScript变量或JavaScript所做的DOM更改。 - Donald Duck
这是不幸的事实。如果没有JavaScript接口并手动将这些变量传递出WebView,我不确定您能为此做什么。 - EpicPandaForce
这个答案能否通过onRestoreInstanceState()来优化? - G. Ciardini
根据这个文档, super.onSaveInstanceState(outState); 应该在修改了outState之后被调用。 - G. Ciardini

4
第一步
<activity android:name=".MainActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize">

第二步
 if (savedInstanceState != null)
    {  ((WebView) findViewById(R.id.webView)).restoreState(savedInstanceState.getBundle("webViewState"));}
    else {
       wv1=(WebView)findViewById(R.id.webView);
        load(); // create seprate functin to loadweb
    }

第三步
  public void load() {
    wv1=(WebView)findViewById(R.id.webView);
    wv1.setWebViewClient(new MyBrowser());
    wv1.getSettings().setLoadsImagesAutomatically(true);
    wv1.getSettings().setJavaScriptEnabled(true);
    wv1.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    wv1.loadUrl("http://citynsr.ueuo.com/");
}
private class MyBrowser extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

第四步
 protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Bundle bundle = new Bundle();
    wv1.saveState(bundle);
    outState.putBundle("webViewState", bundle);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    Bundle bundle = new Bundle();
    wv1.saveState(bundle);
    state.putBundle("webViewState", bundle);
}

1

我正在使用

<activity
    android:name="XYZ.activity.your.browser.activity"
    android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
    android:windowSoftInputMode="adjustPan"/>

我的AndroidManifest.xml文件中有这个内容,它运行得很好,没有调整大小的问题。

然而,在正常的活动中我不建议这样做,但是如果你只有一个WebView、一个工具栏和几个按钮,那么这应该没问题。


是的,但如果我在横屏模式下启动活动并旋转到纵向,则工具栏标题太小,并且工具栏的高度比在纵向启动时要小。 - hegocre

1
改进 @EpicPandaForce 的答案,并且它可以工作!
WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null)
        ((WebView) findViewById(R.id.webView)).restoreState(savedInstanceState.getBundle("webViewState"));
    else {
        webView = (WebView) findViewById(R.id.webView);
        webView.loadUrl("https://www.YAHOO.com/");
    }

}

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Bundle bundle = new Bundle();
    webView.saveState(bundle);
    outState.putBundle("webViewState", bundle);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接