恢复包含动态生成的HTML的webview状态

时间:2012-12-24 11:42:03

标签: android webview state

我的应用程序中有WebView加载动态内容,我希望视图在设备轮换时保持不变。所以我写了以下几行代码:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
} 

在我的onCreate()中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        if(D.bug){
            Log.i(TAG, "Restoring browser state");
        }
        mWebView.restoreState(savedInstanceState);
    } else {
        if(D.bug){
            Log.i(TAG, "Not restoring browser state");
        }
        mWebView.loadUrl("file:///android_asset/html/browser_3col.html");
    }
    return mWebView;
}

但这有效地重新加载了页面。我想传递动态生成的HTML。

我在考虑通过JavascriptInterface转储整个文档HTML,将其存储在outState中,然后通过JavascriptInterface再次重置它。

这会是一个好方法吗?是否有WebView的方法可以让我获得内在的HTML?

1 个答案:

答案 0 :(得分:0)

我当前的解决方案包含以下代码:

在我的JavaScript代码中:

window.JSInterface.dumpInnerHtml(document.documentElement.innerHTML);

JavascriptInterface

@JavascriptInterface
public void dumpInnerHtml(String htmlDump) {
    if (!mBrowseFragment.isDetached()) {
        mBrowseFragment.updateWebviewHtml(htmlDump);
    } 
}
onSaveInstance()中的

    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
    outState.putString(INSTANCE_CONTAINER_HTML, mCurrentHtmlDump);
onCreate()中的

if (savedInstanceState != null) {
        mWebView.restoreState(savedInstanceState);
        String restoredHtml = savedInstanceState
                .getString(INSTANCE_HTML);
        if (restoredHtml != null) { 
            mWebView.loadData(restoredHtml, "text/html", "utf-8");
        }
}

它几乎可以工作。但我有一些问题。似乎loadData()不解释脚本标记。 (我的js功能打破了。),我觉得这可以更优雅地解决。