【问题标题】:Save WebView state on screen rotation [duplicate]在屏幕旋转时保存 WebView 状态 [重复]
【发布时间】:2021-08-15 01:34:04
【问题描述】:

我正在制作自己的浏览器,我需要帮助。我正在努力挽救它的状态。我尝试了以下方法,但不是我正在寻找的解决方案。

我试过了:

<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 状态且不会出现工具栏大小问题?

如果我处理配置更改并尝试调整工具栏和文本的大小,也许会更好?

【问题讨论】:

  • 我没有找到这篇文章。我去看看

标签: android webview


【解决方案1】:

您应该将 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);
}

【讨论】:

  • 这不会保存 Javascript 变量或 Javascript 对 DOM 所做的更改。
  • 不幸的是,这是真的。如果没有 Javascript 界面并手动将这些变量从 WebView 中传递出去,我不确定你能做什么。
【解决方案2】:

第一步

<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);
}

【讨论】:

    【解决方案3】:

    我正在使用

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

    在我的 AndroidManifest.xml 文件中,它工作得很好。没有调整大小的问题。

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

    【讨论】:

    • 是的,但是如果我以横向模式开始活动并旋转到纵向,工具栏标题太小,并且工具栏的高度比纵​​向开始时最小。
    【解决方案4】:

    改进@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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-22
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多