WebView 状态管理

三星评级图标

WebView 是一个常用的组件,用于提供一种高级的状态管理系统。WebView 必须在配置更改后保持原来的状态和滚动位置。用户旋转设备或展开可折叠手机时,WebView 可能会丢失滚动位置,这会迫使用户从 WebView 顶部重新滚动到之前的滚动位置。

最佳做法

尽可能减少重新创建 WebView 的次数。WebView 善于管理其状态,并且您可以通过管理尽可能多的配置更改来利用这种特性。您的应用必须处理配置更改,因为重新创建 Activity(系统处理配置更改的方式)也会重新创建 WebView,这会导致 WebView 丢失其状态。

所需要素

  • android:configChanges:清单 <activity> 元素的属性。 列出由 activity 处理的配置更改。
  • View#invalidate():导致系统重新绘制 View 的方法。由 WebView 继承。

步骤

如需保存 WebView 状态,请尽可能避免重新创建 Activity,然后让 WebView 失效,以便它可以在保持其状态的同时调整大小。

1. 将配置更改添加到 AndroidManifest.xml

指定由您的应用(而不是由系统)处理的配置更改,以避免重新创建 activity:

<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 组件在遇到多种配置更改时仍可保持原来的状态和滚动位置,无论是调整大小、更改屏幕方向还是折叠和展开都不例外。

其他资源

如需详细了解配置更改及其管理方式,请参阅处理 配置更改