You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:45:05