Android WebView调用findAllAsync搜索文本时viewport交替溢出问题求助
解决WebView调用findAllAsync()/findNext()时宽度循环溢出屏幕的问题
我之前也碰到过一模一样的WebView搜索高亮时宽度跳变的坑,折腾了好几种缩放参数都没用,后来试了几个办法终于搞定了,分享给你:
强制搜索后触发重新布局
有时候WebView在处理搜索高亮时,内部布局逻辑会出错,导致宽度计算偏离屏幕。你可以在调用搜索方法后,手动触发一次布局重绘:webView.findAllAsync(searchText); webView.post(() -> { // 强制WebView重新计算布局 webView.requestLayout(); // 保险起见手动设置宽度为match_parent ViewGroup.LayoutParams params = webView.getLayoutParams(); params.width = ViewGroup.LayoutParams.MATCH_PARENT; webView.setLayoutParams(params); });这个方法能快速纠正错误的宽度计算,很多时候第一次就能见效。
自定义WebView限制最大宽度
这是我用下来最稳定的方案,直接从测量阶段就把WebView的宽度锁死在屏幕范围内:public class FixedWidthWebView extends WebView { public FixedWidthWebView(Context context) { super(context); } public FixedWidthWebView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 获取当前屏幕宽度 DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); int screenWidth = metrics.widthPixels; // 强制WebView宽度不超过屏幕宽度 int fixedWidthSpec = MeasureSpec.makeMeasureSpec(screenWidth, MeasureSpec.EXACTLY); super.onMeasure(fixedWidthSpec, heightMeasureSpec); } }把布局里的原生WebView换成这个自定义类,不管内部搜索逻辑怎么折腾,宽度都不会超出屏幕。
重置缩放参数(搜索前后双重保障)
虽然你试过相关缩放参数,但可以试试在搜索前后都重置一次,避免搜索操作偷偷修改WebView的设置:// 初始化时的基础设置 WebSettings settings = webView.getSettings(); settings.setUseWideViewPort(false); settings.setLoadWithOverviewMode(true); settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL); // 搜索前先重置一次 settings.setUseWideViewPort(false); webView.findAllAsync(searchText); // 搜索完成后再确认一次设置 webView.post(() -> settings.setUseWideViewPort(false));有些版本的WebView会在搜索时自动开启
useWideViewPort,手动重置能打断这个错误的逻辑。尝试同步搜索方法findAll()
如果你的搜索文本不长,不会阻塞UI的话,可以试试用同步的findAll()替代异步方法:webView.findAll(searchText); webView.requestLayout();异步搜索的回调时机可能和布局重绘冲突,同步调用能避免这种循环跳变的情况。
你可以按顺序试试这些方法,我当时用自定义WebView的方案彻底解决了循环溢出的问题,希望对你有用!
内容的提问来源于stack exchange,提问作者mortalis
相关产品推荐
相关产品推荐

