22

3つのタブを持つタブホストがあります。これらの各タブには、webiviewがあります。タブをクリックすると、以前にそこにいた場合でもWebビューを「再ロード」する必要があり、保存されていません。Webビューを保存する方法はありますか?

4

3 に答える 3

45

これは、アクティビティでonSaveInstanceState(Bundle outState)を上書きし、WebビューからsaveStateを呼び出すことで処理できます。

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

もちろん、Webビューが再膨張した後、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メソッド内で実際に行う必要があるのは、最後にアクセスしたURLを表示する場合にwebView.loadUrl()を呼び出すことです。次の回答を参照してください。

向きの変更などでWebビューがリロードされることが心配な場合。

向きとkeyboardHiddenの変更を処理するようにアクティビティを設定してから、WebViewをそのままにしておくことができます

于 2015-09-30T13:38:01.487 に答える
1

または、tabHostでフラグメントを使用することを検討することもできます。別のwebViewに入るときは、フラグメントを非表示に設定し、他のフラグメントを表示するように設定できます。前のフラグメントに戻っても、コンテンツは破棄されていません。それは私がそれをした方法であり、それは私のために働いた。

于 2013-10-09T11:26:55.970 に答える