WebView 狀態管理

三顆星評等圖示

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 元件現在會在遇到多種設定變更 (舉凡從調整大小、變更螢幕方向、到折疊和展開) 時保留自身狀態和捲動位置。

其他資源

如要進一步瞭解設定變更及其管理方式,請參閱「處理設定變更」。