2012-12-24 28 views
5

我在加載動態內容的應用程序中有一個WebView,我希望視圖在設備旋轉時保留。所以我寫了下面的代碼行:恢復包含動態生成的HTML的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嗎?

+0

你有沒有發現一個解決方案,將保留javascript&jvascript變量? – Alexey

回答

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

in 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功能打破了。),我覺得這可以更優雅地解決。

+0

2018年;在webviews中保存動態添加的內容仍然不可能? :( – David