3つのタブを持つタブホストがあります。これらの各タブには、webiviewがあります。タブをクリックすると、以前にそこにいた場合でもWebビューを「再ロード」する必要があり、保存されていません。Webビューを保存する方法はありますか?
3 に答える
これは、アクティビティで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)
}
restoreStateは決して信頼できませんでした。そして2015年に来て、文書は事実を受け入れます。(変更はおそらく2014年頃にドキュメントに加えられました)。これは今それが言っていることです。
このWebViewが状態を構築する機会(ページのロード、バック/フォワードリストの作成など)を行った後に呼び出された場合、望ましくない副作用が発生する可能性があります。このメソッドでは、このWebViewの表示データは復元されないことに注意してください。
そして、saveState()の対応するエントリは、次のように話します。
このメソッドは、このWebViewの表示データを保存しなくなったことに注意してください。
onCreateメソッド内で実際に行う必要があるのは、最後にアクセスしたURLを表示する場合にwebView.loadUrl()を呼び出すことです。次の回答を参照してください。
向きの変更などでWebビューがリロードされることが心配な場合。
向きとkeyboardHiddenの変更を処理するようにアクティビティを設定してから、WebViewをそのままにしておくことができます
または、tabHostでフラグメントを使用することを検討することもできます。別のwebViewに入るときは、フラグメントを非表示に設定し、他のフラグメントを表示するように設定できます。前のフラグメントに戻っても、コンテンツは破棄されていません。それは私がそれをした方法であり、それは私のために働いた。