【问题标题】:Disable Checkbox items in alertDialog在 alertDialog 中禁用复选框项目
【发布时间】:2018-10-03 06:44:58
【问题描述】:

我通过警报对话框提供数组以选择多个选项如果数组已满,我想禁用选择

我已经能够在达到限制后停止向数组添加项目,但无法禁用复选框

 AlertDialog.Builder builder=new AlertDialog.Builder(this);
 View view=inflater.inflate(R.layout.dialog_genre,null,false);
 builder.setView(view).setTitle("Select Genres");

 builder.setMultiChoiceItems(array, checkedGenres, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            if(isChecked) {
                if (!selectedgenre.contains(String.valueOf(which)))
                    if(selectedgenre.size()<5)
                {
                    selectedgenre.add(String.valueOf(which));
                    checkedGenres[which]=true;
                }
                else{
                        Toast.makeText(getApplicationContext(),"you can't add more genres",Toast.LENGTH_LONG).show();
                    }
            }
            else if (selectedgenre.contains(String.valueOf(which)))
            {
             selectedgenre.remove(String.valueOf(which));
             checkedGenres[which]=false;
        }
    }
}

【问题讨论】:

    标签: android android-alertdialog


    【解决方案1】:

    ListView 中的视图是可重用的,所以items aren't really linked to a view。但是,您可以在将视图添加到 AlertDialog 的 ListView 内的 ListView 时启用或禁用视图。 ViewGroup.setOnHierarchyChangeListener 让你这样做。

        final CharSequence[] items = new CharSequence[]
                {"9×19mm Sidearm", ".40 Dual Elites", "228 Compact", "Night Hawk .50C"};
        boolean[] checkedItems = new boolean[]{false, false, true, true};
        final boolean[] disabledItems = new boolean[]{false, true, false, true};
    
        Context context = this;
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
        dialogBuilder.setTitle("Select your pistol");
    
        dialogBuilder.setMultiChoiceItems(items, checkedItems,
                new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i, boolean checked) { 
    
            }
        });
    
        AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.getListView().setOnHierarchyChangeListener(
                new ViewGroup.OnHierarchyChangeListener() {
            @Override
            public void onChildViewAdded(View parent, View child) {
                CharSequence text = ((AppCompatCheckedTextView)child).getText();
                int itemIndex = Arrays.asList(items).indexOf(text);
                child.setEnabled(disabledItems[itemIndex]);
            }
    
            @Override
            public void onChildViewRemoved(View view, View view1) {
            }
        });
    
        alertDialog.show();
    

    请注意,setEnable 不会避免触发 clickListeners。如果您不想点击复选框,请添加child.setOnClickListener(null)

    【讨论】:

    • 感谢@Borda,在查看您的答案之前,我浪费了大量时间来执行此任务。但是,您的最后一行(注释)非常关键。
    • 非常感谢,你拯救了我的一天
    【解决方案2】:

    好的,我已经解决了这个问题,两天后我才知道禁用复选框是一个漫长而忙碌的过程,但我们可以禁止选择,这就是我想做的。这是我的解决方案

        builder.setMultiChoiceItems(array, checkedGenres, new DialogInterface.OnMultiChoiceClickListener() {
            int count = 0;
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                if(isChecked) {
                    if (!selectedgenre.contains(String.valueOf(array[which])))
                        if(selectedgenre.size()<5)
                    {
                        selectedgenre.add(String.valueOf(array[which]));
                        checkedGenres[which]=true;                    
                    }
                    else{
                            count--;
                            ((AlertDialog) dialog).getListView().setItemChecked(which, false);
                            checkedGenres[which]=false;
                            Toast.makeText(getApplicationContext(),"you can't add this genre",Toast.LENGTH_LONG).show();
                        }
                }
                else if (selectedgenre.contains(String.valueOf(array[which])))
                {
                    selectedgenre.remove(String.valueOf(array[which]));
                    checkedGenres[which]=false;
                }
            }
        }
    

    【讨论】:

      【解决方案3】:
         builder.setMultiChoiceItems(array, checkedGenres, new DialogInterface.OnMultiChoiceClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                      if(isChecked) {
                          if (!selectedgenre.contains(String.valueOf(which)))
                              if(selectedgenre.size()<5)
                          {
                              selectedgenre.add(String.valueOf(which));
                              checkedGenres[which]=true;
                          }
                          else{
                              //set your checkbox to false here
                              //yourCheckbox.setchecked(false); 
                                  Toast.makeText(getApplicationContext(),"you can't add more genres",Toast.LENGTH_LONG).show();
                              }
                      }
                      else
                      {
                       selectedgenre.remove(String.valueOf(which));
                       checkedGenres[which]=false;
                  }
              }
          }
      

      在你的 else 部分尝试这个.. 问题

      【讨论】:

      • 我想禁用选择,即if(selectedgenre.size()&lt;5)的else
      • 如果我的计数达到 5 我想禁用复选框,用户应该无法选择,即使达到 5 也可以在图像中看到它允许选择
      【解决方案4】:

      在您的 else 部分中,将 clickable false 放在您的复选框上,并更改颜色以便用户识别它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-16
        • 2015-06-28
        • 2014-05-30
        • 2011-08-05
        • 1970-01-01
        • 2012-12-20
        • 2013-02-25
        • 2016-02-01
        相关资源
        最近更新 更多