web-dev-qa-db-ja.com

Android webView saveState

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

19
Ukjent

これは、アクティビティで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)
}
40
Shankar Agarwal

restoreState は決して信頼できませんでした。そして2015年に来て、文書は事実を受け入れます。 (変更はおそらく2014年頃にドキュメントに加えられました)。これはそれが今言っていることです。

このWebViewが状態を構築する機会(ページのロード、バック/フォワードリストの作成など)を行った後に呼び出された場合、望ましくない副作用が発生する可能性があります。このメソッドでは、このWebViewの表示データは復元されないことに注意してください。

そして、saveState()の対応するエントリはこう話します:

このメソッドは、このWebViewの表示データを保存しなくなったことに注意してください。

OnCreateメソッド内で実際に行う必要があるのは、最後にアクセスしたURLを表示する場合にwebView.loadUrl()を呼び出すことです。これを参照してください answer

向きの変更などでウェブビューがリロードされるのが心配な場合。

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

12
e4c5

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

1
sirFunkenstine