为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
相关产品推荐
相关产品推荐

