Android自定义AlertDialog加载数据时无法取消关闭问题求助
问题根因
你遇到的两个问题都是调用逻辑错误导致的:
- 每次调用
Utils.setProgressDialog()都会创建一个全新的AlertDialog实例,你在点击事件里第一次调用生成的对话框会正常弹出,后续调用cancel()、dismiss()时又两次调用了该方法,操作的是两个新生成的不可见实例,最早弹出的对话框始终没有收到关闭指令,自然无法消失。 postViewModel.getPosts()是异步请求逻辑,你之前把关闭对话框的代码紧跟在请求发起代码之后,请求还没执行完成就已经触发了关闭逻辑,对话框甚至还没完成绘制就被销毁,所以看不到弹出效果。
修复方案
1. 调用逻辑修改
只在发起请求前创建一次对话框实例并保存引用,在ViewModel的请求结果回调(成功/失败)中再调用关闭方法,示例代码如下:
binding.loadMoreBtn.setOnClickListener(view -> { // 仅创建一次对话框实例,保存引用 AlertDialog loadingDialog = Utils.setProgressDialog(requireContext()); if (Utils.hasNetworkAccess(requireContext())) { postViewModel.getPosts(); } else { postViewModel.getAllItemsFromDataBase.getValue(); } // 观察请求成功的LiveData回调 postViewModel.getPostsLiveData().observe(getViewLifecycleOwner(), posts -> { if (loadingDialog != null && loadingDialog.isShowing()) { loadingDialog.dismiss(); } // 此处添加列表更新逻辑 }); // 观察请求失败的LiveData回调,异常场景也要关闭对话框 postViewModel.getRequestErrorLiveData().observe(getViewLifecycleOwner(), errorMsg -> { if (loadingDialog != null && loadingDialog.isShowing()) { loadingDialog.dismiss(); } Toast.makeText(requireContext(), "加载失败:" + errorMsg, Toast.LENGTH_SHORT).show(); }); });
2. 可选优化(Utils方法)
如果需要支持用户点击返回键关闭加载框,可以修改setProgressDialog中的配置:
// 原配置 builder.setCancelable(false); // 改为true即可支持返回键关闭 builder.setCancelable(true);
内容的提问来源于stack exchange,提问作者Dr Mido
相关产品推荐
相关产品推荐

