【问题标题】:How to select all checkboxes, while clicking the main checkbox in android?如何选择所有复选框,同时单击android中的主复选框?
【发布时间】:2020-06-03 05:20:35
【问题描述】:

我需要选择主复选框,所有其他部分复选框也被选中

我的要求是,我有一个复选框 selectAll 和一些其他复选框,通过单击此 selectAll 复选框,必须选中所有其他复选框。并且在单击部分复选框时,selectAll 复选框选择必须消失。

 selectAllCheckbox.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                CheckBox cb = (CheckBox) view;
                isPartial = true;
                splitItemAdapter.selectAllItem(cb.isChecked());
                if (isFromCashPayment) {
                    if (cb.isChecked()) {
                      selectAllCheckbox.setChecked(true);
                      isitemChecked = true;




                    } else {

                        selectAllCheckbox.setChecked(false);

                        isitemChecked = false;



                    }
                }
            }
        });

【问题讨论】:

  • 你遇到了什么问题?
  • 单击所有部分复选框后,主复选框中没有选择。
  • 您还必须在部分复选框上添加 setOnClickListener,并循环遍历所有复选框并更新 selectAllCheckbox。
  • if (cb.isChecked()){selectAllCheckbox.setChecked(true)} 是多余的。 cb IS selectAllCheckbox
  • 希望你能得到答案。 :)

标签: java android android-studio checkbox


【解决方案1】:

Select All Checkboxes 函数的实现如下,Kotlin 语言代码比较简单:

private val checkboxes by lazy {
    listOf(
        checkbox1,
        checkbox2,
        checkbox3,
        checkboxX
    )
}

// can implement the CompoundButton.OnCheckedChangeListener on an Activity or Fragment instead
private val onCheckedChangeListener = CompoundButton.OnCheckedChangeListener { button, isChecked ->
    if (!buttonView.isPressed)
        // note that this breaks when accessibility mode is enabled,
        // e.g. isPressed() returns false e.g. when the event is triggered by a double tap from voice assistant.
        return

    when(buttonView.id) {
        R.id.checkboxSelectAll -> {
            checkboxes.forEach { it.isChecked = isChecked }
        }
        else -> {
            if (isChecked && checkboxes.all { it.isChecked }) {
                checkboxSelectAll.isChecked = true
            } else if (!isChecked && checkboxSelectAll.isChecked) {
                checkboxSelectAll.isChecked = false
            }
        }
    }
}

// assume this code is within an Activity
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_activity)

    checkboxSelectAll.setOnCheckedChangeListener(onCheckedChangeListener);
    checkboxes.forEach { it.setOnCheckedChangeListener(onCheckedChangeListener) }
}

*请注意,此解决方案不适用于需要支持辅助功能的应用。

【讨论】:

    【解决方案2】:

    你可以试试这个代码:

    创建时

            parent = findViewById(R.id.parent_checkbox);
            child1 = findViewById(R.id.child_checkbox_1);
            child2 = findViewById(R.id.child_checkbox_2);
    
            parent.setOnCheckedChangeListener(this);
            child1.setOnCheckedChangeListener(this);
            child2.setOnCheckedChangeListener(this);
    

    OnCheckChanged

    @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            checkCheckBox(buttonView);
        }
    

    checkCheckBox 方法

    public void checkCheckBox(View view){
         if (parent.isChecked() && view.getId() == R.id.parent_checkbox){
             child1.setChecked(true);
             child2.setChecked(true);
         }
         else if (!parent.isChecked() && view.getId() == R.id.parent_checkbox){
             if (child1.isChecked() && child2.isChecked()){
                 child1.setChecked(false);
                 child2.setChecked(false);
             }
         }
         else if (!parent.isChecked()){
             if (child1.isChecked() && child2.isChecked()){
                 parent.setChecked(true);
             }
         }
         else if (parent.isChecked() && !child1.isChecked() || !child2.isChecked()){
             parent.setChecked(false);
         }
        }
    

    【讨论】:

      【解决方案3】:

      使用此演示 kotlin 代码检查逻辑...

              checkBox1.setOnClickListener {
                  if (checkBox2.isChecked) {
                      selectAllCheckbox.isChecked = true
                  }
      
                  if (!checkBox2.isChecked || !checkBox1.isChecked) {
                      selectAllCheckbox.isChecked = false
                  }
              }
              checkBox2.setOnClickListener {
                  if (checkBox1.isChecked) {
                      selectAllCheckbox.isChecked = true
                  }
                  if (!checkBox1.isChecked || !checkBox2.isChecked) {
                      selectAllCheckbox.isChecked = false
                  }
              }
              selectAllCheckbox.setOnClickListener {
                  if (selectAllCheckbox.isChecked) {
                      checkBox1.isChecked = true
                      checkBox2.isChecked = true
                  }
                  if (!selectAllCheckbox.isChecked) {
                      checkBox1.isChecked = false
                      checkBox2.isChecked = false
                  }
              }
      

      【讨论】:

        【解决方案4】:

        您可以使用这种方式。首先,所有复选框都在一个布局中。然后你使用这个代码块。

        layout.xml

        ...
         <CheckBox android:id="@+id/allCheckbox" />
         <LinearLayout android:id="@+id/checkboxLayouts"...>
        
                       <CheckBox  android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"/>
        
                       <CheckBox  android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"/>
        
                       <CheckBox android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"/>
        
                       <CheckBox  android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"/>
        </LinearLayout>
        ...
        

        代码

        LinearLayout checkboxLayout = findViewById(R.id.checkboxLayouts);
        
        checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
           @Override
           public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
               for(int i=0 ; i < checkboxLayout.getChildCount(); i++) {
                  if(checkboxLayout.getChildAt(i) instanceof CheckBox) {
                     ((CheckBox) checkboxLayout.getChildAt(i)).setChecked(isChecked);
                  }
               }
         }
        });
        

        注意:我无法检查代码。抱歉语法错误。

        【讨论】:

        • 这不是我的要求。我有一个主复选框和几个部分复选框。通过单击所有部分复选框,主复选框也自动选中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多