Android WebView如何固定滚动位置 启动时自动跳转指定位置?
解决方案
一、实现启动自动跳转到目标位置
方法1:固定坐标跳转(适合网页结构稳定的场景)
- 先获取目标位置的准确坐标:先运行代码,手动滑动到目标图片位置,修改原有的触摸日志代码,抬手时打印最终位置更精准:
public boolean onTouchEvent(final MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { int XPos = webView.getScrollX(); int YPos = webView.getScrollY(); Log.v("Scroll", "XPos = " + XPos + " YPos = " + YPos); } return false; }
- 记录打印得到的YPos数值,比如测试得到的目标位置Y坐标是1400。
- 给WebView设置
WebViewClient,等待页面加载完成后执行滚动,在onCreate中补充以下代码:
webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 填入你实测得到的X、Y坐标即可 webView.scrollTo(0, 1400); // 如果页面存在动态加载内容,onPageFinished触发时元素还未渲染,可以加延时再滚动 // webView.postDelayed(() -> webView.scrollTo(0, 1400), 300); } });
方法2:JS定位元素跳转(稳定性更高,不受网页布局调整影响)
不用手动测量坐标,直接通过JS定位到标题为“Weather today across the country”的目标元素,获取坐标后自动滚动:
webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 执行JS获取目标元素的Y轴坐标 view.evaluateJavascript("document.querySelector('img[title=\"Weather today across the country\"]').offsetTop", value -> { int yPos = Integer.parseInt(value); webView.scrollTo(0, yPos); }); } });
注:如果上述选择器匹配不到元素,可以根据实际网页属性调整,比如用
img[alt="xxx"]匹配元素的alt属性。
二、横竖屏切换的位置保留问题
默认情况下横竖屏切换会触发Activity销毁重建,WebView会重新加载页面,滚动位置不会自动保留,需要做适配,可选择两种方案:
方案1:禁止Activity重建(实现最简单)
在AndroidManifest.xml中给当前Activity添加配置:
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden" />
添加后横竖屏切换时Activity不会重建,WebView的状态包括滚动位置会自动保留,无需额外代码。
方案2:保存状态适配Activity重建
如果业务需要Activity正常重建,就通过onSaveInstanceState保存和恢复WebView状态:
@Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); webView.saveState(outState); } @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); webView.restoreState(savedInstanceState); }
同时在onCreate中补充恢复逻辑:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient()); // 恢复状态判断 if (savedInstanceState != null) { webView.restoreState(savedInstanceState); } else { webView.loadUrl("https://weather.com/?Goto=Redirected"); } // 补充上述的WebViewClient配置 }
内容的提问来源于stack exchange,提问作者khajlk
相关产品推荐
相关产品推荐

