22

我有一个带有 3 个标签的标签主机。在每个选项卡中都有一个 webiview。当我单击一个选项卡时,即使我以前去过那里,webview 也需要“重新加载”,它还没有被保存。有什么办法可以保存 webview 吗?

4

3 回答 3

45

这可以通过在您的活动中覆盖 onSaveInstanceState(Bundle outState) 并从 web 视图调用 saveState 来处理:

@Override
protected void onSaveInstanceState(Bundle outState) {
    webView.saveState(outState);
    super.onSaveInstanceState(outState); 
}

然后在 webview 重新膨胀之后在你的 onCreate 中恢复它:

@Override
public void onCreate(final Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.blah);
   WebView webview = (WebView)findViewById(R.id.webview);
   if (savedInstanceState != null)
      webview.restoreState(savedInstanceState);
   else
      webview.loadUrl(URLData)
}
于 2012-04-21T12:13:43.103 回答
14

restoreState从不可靠。而到2015年的文件接受事实。(可能是在 2014 年左右对文件进行了更改)。这就是它现在所说的。

如果在此 WebView 有机会建立状态(加载页面、创建后退/前进列表等)之后调用它,则可能会产生不良副作用。请注意,此方法不再恢复此 WebView 的显示数据。

saveState() 的相应条目是这样说的:

请注意,此方法不再存储此 WebView 的显示数据。

在 onCreate 方法中你真正应该做的是调用 webView.loadUrl() 如果你想显示最后访问的 url,请看这个答案

如果您担心 webview 在方向更改等时重新加载。

你可以设置你的活动来处理方向和键盘隐藏的变化,然后只留下 WebView

于 2015-09-30T13:38:01.487 回答
1

或者,您可以考虑将片段与您的 tabHost 一起使用。进入另一个 webView 时,您可以将片段设置为隐藏,另一个显示。当您返回上一个片段时,内容不会被破坏。我就是这样做的,它对我有用。

于 2013-10-09T11:26:55.970 回答