Android Kotlin中WebView下方TextView被黑条遮挡的问题排查
解决WebView遮挡下方TextView的问题
问题原因
当WebView设置wrap_content高度时,若HTML内容过长,WebView的实际高度会超出屏幕可视范围,导致TextView被挤到屏幕外;同时WebView自身的滚动逻辑会让你无法看到下方的TextView,黑条是WebView内容高度计算异常的表现。
解决方案
方案1:WebView占满剩余空间,TextView固定在底部
修改activity_main.xml,给WebView添加底部约束,让它填充顶部到TextView之间的空间,WebView自身负责滚动长内容:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/wbvTextParagraph" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@+id/textView" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tvSample" android:layout_marginVertical="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
此方案下TextView始终固定在屏幕底部可见,WebView自动填充剩余空间并滚动内部内容。
方案2:WebView与TextView整体滚动
若需要两者随页面一起滚动,可将它们放入ScrollView,同时禁用WebView自身滚动:
- 修改布局文件:
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <WebView android:id="@+id/wbvTextParagraph" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tvSample" android:layout_marginTop="16dp" android:padding="8dp"/> </LinearLayout> </ScrollView>
- 在
MainActivity中禁用WebView滚动:
package com.example.webviewtest import android.annotation.SuppressLint import android.os.Bundle import android.view.MotionEvent import android.webkit.WebView import android.webkit.WebViewClient import androidx.appcompat.app.AppCompatActivity class MainActivity: AppCompatActivity() { @SuppressLint("SetJavaScriptEnabled") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val webView = findViewById<WebView>(R.id.wbvTextParagraph) webView.webViewClient = WebViewClient() webView.loadUrl("file:///android_asset/text-web.html") webView.settings.javaScriptEnabled = true webView.settings.setSupportZoom(true) // 禁用WebView自身滚动,交由ScrollView控制整体滚动 webView.isVerticalScrollBarEnabled = false webView.setOnTouchListener { _, event -> event.action == MotionEvent.ACTION_MOVE } } }
此方案下整个页面(WebView+TextView)可一起滚动,TextView会在WebView内容之后显示。
内容的提问来源于stack exchange,提问作者zaldoarigi
相关产品推荐
相关产品推荐

