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

为WebView添加SwipeRefreshLayout下拉刷新功能时应用闪退如何解决

核心问题原因

你代码中触发崩溃的根源是SwipeRefreshLayout实例获取错误导致空指针异常:
你的SwipeRefreshLayout定义在fragment_about.xml布局中,你已经将该布局inflater为root对象,但你却用父容器container去查找swipe控件,返回值为null,后续调用setOnRefreshListener时直接触发空指针崩溃。

修正后的Java代码

private AboutViewModel aboutViewModel;
SwipeRefreshLayout swipe;

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View root;
    aboutViewModel = new ViewModelProvider(this).get(AboutViewModel.class);
    root = inflater.inflate(R.layout.fragment_about, container, false);

    WebView webView = root.findViewById(R.id.web_view_about);
    webView.loadUrl("https://example.com");
    webView.setWebViewClient(new WebViewController());

    // 从当前fragment加载的root布局中查找swipe控件
    swipe = root.findViewById(R.id.swipe);
    swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            webView.reload();
            // 网页加载完成后主动关闭刷新动画,避免刷新指示器一直转动
            webView.setWebViewClient(new WebViewController(){
                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);
                    if (swipe.isRefreshing()) {
                        swipe.setRefreshing(false);
                    }
                }
            });
        }
    });
    return root;
}

额外优化注意点

  • 变量命名建议遵循Java小驼峰规范,原代码中AboutViewModel变量名首字母大写不符合常规命名规范,容易和类名混淆
  • 若你的WebView需要加载包含JS的复杂网页,可提前配置WebSettings相关参数,避免网页加载功能异常
  • 你提供的XML布局代码没有问题,无需修改

内容的提问来源于stack exchange,提问作者FelbD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:18:03