【问题标题】:Alertdialog running ongoing dosen't dismiss or cancel正在运行的 Alertdialog 不会关闭或取消
【发布时间】:2021-11-27 23:53:42
【问题描述】:

根据answer,我想显示 dilaog,直到加载接下来的 10 个帖子,所以我创建了静态 alertDialog 方法以在我的应用程序的不同位置使用它,但问题是对话框不会取消或关闭

setProgressDialog 在 Utils 类中

 public static AlertDialog setProgressDialog(Context context) {

        int llPadding = 30;
        LinearLayout ll = new LinearLayout(context);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        ll.setPadding(llPadding, llPadding, llPadding, llPadding);
        ll.setGravity(Gravity.CENTER);
        LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        llParam.gravity = Gravity.CENTER;
        ll.setLayoutParams(llParam);

        ProgressBar progressBar = new ProgressBar(context);
        progressBar.setIndeterminate(true);
        progressBar.setPadding(0, 0, llPadding, 0);
        progressBar.setLayoutParams(llParam);

        llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        llParam.gravity = Gravity.CENTER;
        TextView tvText = new TextView(context);
        tvText.setText("Loading ...");
        tvText.setTextColor(context.getResources().getColor(R.color.black));
        tvText.setTextSize(20);
        tvText.setLayoutParams(llParam);

        ll.addView(progressBar);
        ll.addView(tvText);

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setCancelable(false);
        builder.setView(ll);

        AlertDialog dialog = builder.create();
        dialog.show();
        Window window = dialog.getWindow();
        if (window != null) {
            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
            layoutParams.copyFrom(dialog.getWindow().getAttributes());
            layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
            layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
            dialog.getWindow().setAttributes(layoutParams);
        }
        return dialog;
    }

然后我在 HomeFragment 点击加载更多按钮时使用它

binding.loadMoreBtn.setOnClickListener(view -> {

            Utils.setProgressDialog(requireContext());

            if (Utils.hasNetworkAccess(requireContext())) {
                postViewModel.getPosts();
//                Log.w(TAG, "loadMoreBtn: "+dialog.isShowing() );
            } else {
                postViewModel.getAllItemsFromDataBase.getValue();
            }
            Utils.setProgressDialog(requireContext()).cancel();
            Utils.setProgressDialog(requireContext()).dismiss();

        });

PS:我也尝试创建对话框AlertDialog dialog = Utils.setProgressDialog(requireContext());,而不是直接调用该方法然后dialod.show(),并在getPosts 之后取消或关闭它但它不会出现

【问题讨论】:

    标签: java android android-alertdialog android-progressbar android-dialog


    【解决方案1】:

    我通过在视图模型中添加一个标志布尔值来检测加载状态来修复它

    public final MutableLiveData<Boolean> isLoading = new MutableLiveData<>();
    

    并像这样在getPosts() 中使用它

    public void getPosts() {
            Log.e(TAG, finalURL.getValue());
    
            isLoading.setValue(true);
            repository.remoteDataSource.getPostList(finalURL.getValue())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Response<PostList>>() {
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
    
                        }
    
                        @Override
                        public void onNext(@NonNull Response<PostList> postListResponse) {
    
                            if (postListResponse.isSuccessful()) {
                                if (postListResponse.body() != null
                                        && postListResponse.body().getNextPageToken() != null) {
                                    Log.e(TAG, postListResponse.body().getNextPageToken());
                                    token.setValue(postListResponse.body().getNextPageToken());
                                    isLoading.setValue(false);
                                }
                                postListMutableLiveData.setValue(postListResponse.body());
    

    最后在按钮点击的片段中

    binding.loadMoreBtn.setOnClickListener(view -> {
                AlertDialog dialog = Utils.setProgressDialog(requireContext());
    
                postViewModel.isLoading.observe(getViewLifecycleOwner(), isLoading -> {
                    if (isLoading) {
                        dialog.show();
                    } else {
                        dialog.dismiss();
                    }
                });
    
                if (Utils.hasNetworkAccess(requireContext())) {
                    postViewModel.getPosts();
                    Log.w(TAG, "loadMoreBtn: " + dialog.isShowing());
                } else {
                    postViewModel.isLoading.postValue(true);
                    postViewModel.getAllItemsFromDataBase.getValue();
                    postViewModel.isLoading.postValue(false);
                }
    
            });
    

    【讨论】:

      【解决方案2】:
      binding.loadMoreBtn.setOnClickListener(view -> {
      
              Utils.setProgressDialog(requireContext());
      
              if (Utils.hasNetworkAccess(requireContext())) {
                  postViewModel.getPosts(); //                Log.w(TAG, "loadMoreBtn: "+dialog.isShowing() );
              } else {
                  postViewModel.getAllItemsFromDataBase.getValue();
              }
              Utils.setProgressDialog(requireContext()).cancel();
              Utils.setProgressDialog(requireContext()).dismiss();
      
          });
      

      这里你多次调用了静态方法Utils.setProgressDialog();并且每次调用它时,它都会返回一个全新的对话框,因此您可以关闭一个未显示在屏幕上的对话框。

      相反,您需要将第一次调用该方法返回的对话框存储到一个变量中:

      AlertDialog dialog = Utils.setProgressDialog(requireContext());
      

      然后在该对话框版本上调用 dismissdialog.dismiss()dialog.cancel(),只要您需要关闭它。

      【讨论】:

      • 我尝试了这个AlertDialog dialog = Utils.setProgressDialog(requireContext()); 然后dialog.show(); 并关闭了没有出现的对话框,似乎从方法返回的对话框与创建的不同
      • @DrMido 根据您共享的代码,您在显示对话框后立即关闭它;所以它不会有机会显示在屏幕上。相反,您需要在postViewModel.getPostspostViewModel.getAllItemsFromDataBase.getValue() 完成时进行回调,以便您可以关闭对话框。如果有什么令人困惑的地方,请告诉我。
      • 如果我理解你的话,我不能从这个方法创建回调 postViewModel.getPosts(); 因为它在视图模型中是无效的并且包含一个 rxjava 改造调用,我认为这很好'使问题过于复杂只显示带有进度条的对话框,第一次显示带有进度条的对话框,但它不会关闭,第二次使用AlertDialog dialog = Utils.setProgressDialog(requireContext()); 时根本看不到它:“D,缺少一些东西
      • @DrMido 如果您只想在第二个选项中看到它,只需删除 dialog.dismiss()dialog.cancel() :)
      • 谢谢我知道了,我会搜索如何检测响应调用是否完成以关闭它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多