Android WebView 滚动不流畅并跳转/有回调

Posted

技术标签:

【中文标题】Android WebView 滚动不流畅并跳转/有回调【英文标题】:Android WebView scroll is not smooth and jumps / have pullbacks 【发布时间】:2019-12-19 18:11:40 【问题描述】:

在 Pixel 3 和 android Pie 上测试我的应用时,我发现我的应用中的 Webview 出现奇怪的滚动行为,向下或向上滚动时,滚动根本不流畅,有时会跳回原来的位置或完全跳到顶部或底部。

当我向上或向下滑动(拖动然后放开)时会发生这种情况

这里是问题的快速浏览(我试图向下滚动): https://imgur.com/a/8acgfCx

向下滚动时,它移动得很慢,它移动得很少,然后滚动到最后自己跳到顶部一点。

这是一个扩展版本,当滚动即将停止然后稍微跳跃时,跳跃(随机)发生。 https://imgur.com/a/K0N0utK

我正在使用 LG 手机和华为手机-真实设备-(棉花糖和牛轧糖)测试我的应用,在这些设备中都没有任何问题。

在模拟器上,我使用 Android API 23 (M) 测试了 Nexus 5,没有遇到任何问题。但是将 Nexus 5 上的操作系统更改为 Android Oreo,也发现了滚动问题。

我以为问题出在 Android Oreo+... 但后来我在带有 Android 23 (M) 的模拟器 Pixel 3 上进行了测试,并且遇到了同样的滚动问题。所以也许设备有问题,但安卓版本也有。

我尝试像这样更改图层类型:

webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)

但没有任何作用。 Manifest 中的“hardwareAccelerated”标签为真。

webview 的设置非常简单:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".destinations.common.WebViewDestFragment" android:id="@+id/root_layout">
    <WebView
            android:id="@+id/webView"
            android:layout_
            android:layout_
            android:overScrollMode="never"
            android:scrollbars="vertical"
            android:fadeScrollbars="false"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    </WebView>
</androidx.constraintlayout.widget.ConstraintLayout>

设置也很基本:

webView.settings.javascriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.databaseEnabled = true
webView.settings.cacheMode = LOAD_CACHE_ELSE_NETWORK

这可能是硬件或 Android API 问题吗?

【问题讨论】:

您是否尝试将 android:layout_ 更改为 android:layout_?也与 android:layout_height 相同 谢谢回复,刚试了下,同样的问题,你觉得ConstraintLayout有什么问题吗?我会尝试使用 LinearLayout。 我在这篇文章中添加了一个答案。希望对你有帮助 【参考方案1】:

试着像这样改变你的布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".HomeActivity">

<WebView
    android:id="@+id/webview"
    android:layout_
    android:layout_
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:overScrollMode="never"/>

</android.support.constraint.ConstraintLayout>

并将其添加到您的 java 文件中

if (Build.VERSION.SDK_INT >= 21) 
        webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    

    //FOR WEBPAGE SLOW UI
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
        webview.setLayerType(View.LAYER_TYPE_HARDWARE, null);
     else 
        webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    

【讨论】:

很遗憾,感谢您的回答.. 同样的问题,我注意到有时它滚动得很好,然后又滚动得很慢。我将尝试一个仅包含 webview 的全新项目并使用此答案,以确保当前问题与当前项目中的某些内容无关。 我发现你将它导入到另一个布局中的某个地方,它是一个片段?因为这是在您的代码工具中实现的:context=".destinations.common.WebViewDestFragment" 也许它有时会导致您的滚动错误。 我尝试了一个全新的项目(没有片段或任何东西,只有 MainActivity),我只是添加了一个具有互联网权限的 webview,并添加了这个答案中提供的设置,同样的问题。我在模拟器上使用 Pixel 3 API 24、25 和 26 进行了测试,在所有这些 API 中都有相同的奇怪行为,还有 Nexus 6 API 24 和相同的问题,但是......尝试了 Nexus 5 API 24,并且滚动按预期工作。所以我开始相信这是一个硬件问题.. 尝试在 AndroidManifest 中添加这个 android:supportsRtl="true" android:hardwareAccelerated="true" android:usesCleartextTraffic="true" 好的,很高兴听到这个消息。希望我对你有所帮助。编码愉快!

以上是关于Android WebView 滚动不流畅并跳转/有回调的主要内容,如果未能解决你的问题,请参考以下文章

为表单字段显示软键盘时,Android 4.3 Webview 不滚动

Android WebView - 滚动条不填充 layout_height

ListView在Android中滚动流畅吗?

Android WebView 可滚动

ScrollView 内的 Android WebView 仅滚动滚动视图

QScroller 动态滚动不流畅