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 组件在遇到多种配置更改时仍可保持原来的状态和滚动位置,无论是调整大小、更改屏幕方向还是折叠和展开都不例外。
其他资源
如需详细了解配置更改及其管理方式,请参阅处理 配置更改。