Android WebView无法加载首页但其他页面正常 顶部导航点击首页失效问题
问题根因
- 初始化顺序错误:HomeFragment中先调用
loadUrl加载首页,后设置WebViewClient,导致首次加载首页的请求没有被自定义的WebViewController拦截处理,配置和JS注入逻辑未生效 - JS注入时机错误:在
shouldOverrideUrlLoading中直接执行隐藏元素的JS代码,此时目标页面还未完成加载,DOM元素尚未渲染,JS执行时找不到site-navigation元素会抛出异常,严重时会中断后续的页面加载流程 - 配置逻辑位置错误:WebSettings的相关配置不需要每次url跳转时重复设置,放在
shouldOverrideUrlLoading中属于冗余操作,还可能引发不必要的性能问题 - 连续调用loadUrl的冲突:
shouldOverrideUrlLoading中先调用loadUrl执行JS,再调用loadUrl加载目标url,两次异步加载请求会出现抢占,可能导致目标url加载被终止
修复方案
1. 调整HomeFragment初始化顺序,统一配置WebSettings
把WebSettings的配置移到WebView初始化的位置,先设置WebViewClient和配置,再加载首页:
package com.example.couponcheetah.ui.home; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebSettings; import android.webkit.WebView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.example.couponcheetah.WebViewController; import com.example.couponcheetah.R; public class HomeFragment extends Fragment { private HomeViewModel homeViewModel; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); View root = inflater.inflate(R.layout.fragment_home, container, false); WebView webView=root.findViewById(R.id.web_view_home); // 统一配置WebSettings WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setSupportZoom(false); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 先设置WebViewClient webView.setWebViewClient(new WebViewController()); // 最后加载首页地址 webView.loadUrl("https://couponcheetah.com"); return root; } }
2. 调整WebViewController逻辑,修改JS注入时机
重写onPageFinished方法,等页面DOM渲染完成后再执行隐藏元素的JS,shouldOverrideUrlLoading只处理url跳转逻辑:
package com.example.couponcheetah; import android.webkit.WebView; import android.webkit.WebViewClient; public class WebViewController extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 页面加载完成后执行JS,增加元素判空避免异常 view.loadUrl("javascript:(function() { " + "var nav = document.getElementById('site-navigation'); if(nav) nav.style.display='none';})()"); } }
可选兼容优化
如果适配Android 7.0及以上系统版本,建议额外重载shouldOverrideUrlLoading(WebView view, WebResourceRequest request)方法,避免新版本系统中跳转逻辑不生效。
内容的提问来源于stack exchange,提问作者user70987
相关产品推荐
相关产品推荐

