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();
}
這個步驟僅適用於 View 系統,因為 Jetpack Compose 不需要將任何內容作廢,即可正確調整 Composable 元素大小。不過,如果管理方式不當,Compose 往往會重新建立 WebView。此時不妨使用 Accompanist WebView 包裝函式在 Compose 應用程式中儲存及還原 WebView 狀態。
結果
應用程式的 WebView 元件現在會在遇到多種設定變更 (舉凡從調整大小、變更螢幕方向、到折疊和展開) 時保留自身狀態和捲動位置。
其他資源
如要進一步瞭解設定變更及其管理方式,請參閱「處理設定變更」。