WebView は、状態管理の高度なシステムを提供する、よく使われるコンポーネントです。WebView は、構成の変更後も状態とスクロール位置を維持する必要があります。WebView は、ユーザーがデバイスを回転させるか折りたたみ式スマートフォンを開くと、スクロール位置を喪失することがあります。そのため、ユーザーは WebView の最上部から前のスクロール位置まで再びスクロールする必要があります。
ベスト プラクティス
WebView の再作成回数を最小限に抑えます。WebView は状態を管理しやすく、構成変更をできるだけ多く管理することでこの品質を利用できます。Activity の再作成(システムによる構成変更の処理方法)でも WebView が再作成され、WebView の状態が喪失するため、アプリが構成の変更を処理する必要があります。
材料
android:configChanges: マニフェストの<activity>要素の属性。アクティビティによって処理される構成変更をリストします。View#invalidate(): ビューを再描画させるメソッド。WebViewによって継承されます。
手順
WebView 状態を保存するには、Activity の再作成をできるだけ回避してから、WebView を無効にして、状態を保持したままサイズ変更できるようにします。
1. AndroidManifest.xml に構成の変更を追加する
(システムではなく)アプリで処理する構成変更を指定して、アクティビティの再作成を回避します。
<activity
android:name=".MyActivity"
android:configChanges="screenLayout|orientation|screenSize
|keyboard|keyboardHidden|smallestScreenSize" />
2. 構成の変更時に WebView を無効にする
Kotlin
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
webView.invalidate()
}
Java
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
webview.invalidate();
}
このステップはビューシステムにのみ適用されます。Composable 要素を正しくサイズ変更するために Jetpack Compose が無効にする必要があるものは何もないためです。ただし、正しく管理されていない場合、Compose は WebView を頻繁に再作成します。Accompanist WebView ラッパーを使用して、Compose アプリの WebView の状態を保存および復元します。
結果
アプリの WebView コンポーネントは、サイズ変更から向きの変更、開閉まで、複数の構成変更の後も状態とスクロール位置を保持するようになりました。
参考情報
構成変更とその管理方法について詳しくは、構成の変更に対処するをご覧ください。