【问题标题】:Getting the isChecked() value from CheckBox or RadioButton从 CheckBox 或 RadioButton 获取 isChecked() 值
【发布时间】:2016-11-17 12:14:09
【问题描述】:

我在CheckBoxRadioButton 视图上设置了点击事件监听器。这两种视图类型都有一个isChecked() 方法。我可以通过为每个单独的 switch case 转换为它的类型来获取其中任何一个的状态,但是在我进入 switch case 之前,我能否获得它们中任何一个的一般意义上的状态?

@Override
public void onClick(View view) {

    boolean checkState;

    switch (view.getId()) {
        case R.id.radio_button_1:
            checkState = ((RadioButton) view).isChecked();
            // ...
            break;
        case R.id.check_box_1:
            checkState = ((CheckBox) view).isChecked();
            // ...
            break;
        // more check boxes and ratio buttons ...
    }
}

这个问题的标题与this one 相似,但是那里的代码太多,我很难理解他们是否问的是同样的问题。

在我写这个问题的过程中,我找到了一个答案,我将在下面发布。不过,如果有更好的答案,我会接受的。

【问题讨论】:

    标签: android checkbox radio-button


    【解决方案1】:

    考虑一个 RadioButton 和一个 CheckBox

    RadioButton button = (RadioButton) findViewById(R.id.radio_button);
    button.setOnCheckedChangeListener(listener);
    
    
    CheckBox box = (CheckBox) findViewById(R.id.checkbox);
    box.setOnCheckedChangeListener(listener);
    

    两者都有一个监听器

    CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(buttonView instanceof CheckBox ){
                    Toast.makeText(getApplicationContext(), "ChechBox " + String.valueOf(isChecked), Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(getApplicationContext(), "RadionButton " + String.valueOf(isChecked), Toast.LENGTH_SHORT).show();
                }
            }
    };
    

    如果还有很多,我们可以使用单个监听器,如下所示

    CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(buttonView instanceof CheckBox ){
                    final ChechBox b = (ChechBox)buttonView;
                    switch(b.getId()){
                       case R.id.first_checkbox:
                       . . . . . . . .
                    }
                }else {
                    final RadioButton r = (RadioButton)buttonView;
                    switch(r.getId()){
                        case R.id.first_radio
                        . . . . . . . . . . . 
                    }
                }
            }
    };
    

    您需要将所有视图附加到此侦听器

    【讨论】:

    • +1 以获得有效答案。不过,我认为最好为单选按钮和复选框使用不同的侦听器。请参阅我的更新答案。
    【解决方案2】:

    直接回答

    正如 @MikeM 在 cmets 中回答的那样,您可以使用 instanceof 检查一次 CompoundButtonCheckable 并转换为。

    @Override
    public void onClick(View view) {
    
        boolean checkState = false;
        if (view instanceof Checkable) {
            checkState = ((Checkable) view).isChecked();
        }
    
        switch (view.getId()) {
            // ...
        }
    }
    

    更好的答案

    但是,正如@MikeM 也提到的,您应该使用OnCheckedChangeListener 而不是OnClickListener。有两个类似的已检查更改的侦听器:

    CompoundButton 侦听器可用于CheckBoxRadioButton。但是,如果RadioGroup 中的所有单选按钮都设置了此设置,则侦听器将被调用两次,一次用于关闭按钮,一次用于打开按钮。因此,单选按钮最好使用RadioGroup 监听器。

    因此将RadioGroup.OnCheckedChangeListener 添加到RadioGroup 并将CompoundButton.OnCheckedChangeListener 添加到每个CheckBox

    // set RadioGroup.OnCheckedChangeListener
    RadioGroup rg = (RadioGroup) view.findViewById(R.id.radio_group);
    rg.setOnCheckedChangeListener(radioGroupListener);
    
    // set `CompoundButton.OnCheckedChangeListener`
    CheckBox cb1 = (CheckBox) view.findViewById(R.id.check_box_1);
    cb1.setOnCheckedChangeListener(checkBoxListener);
    CheckBox cb2 = (CheckBox) view.findViewById(R.id.check_box_2);
    cb2.setOnCheckedChangeListener(checkBoxListener);
    // ...
    

    监听器的实现方式如下:

    单选按钮

    对于RadioGroup 侦听器返回的任何RadioButton id,isChecked() 的值都是true

    RadioGroup.OnCheckedChangeListener radioGroupListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
    
            // checkedId is the id of the newly checked radio button
            switch (checkedId) {
                case R.id.radio_button_1:
                    // ...
                    break;
                case R.id..radio_button_2:
                    // ...
                    break;
                // ...
            }
        }
    };
    

    复选框

    isChecked 值直接传递给CompoundButton 监听器。

    CompoundButton.OnCheckedChangeListener checkBoxListener = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
            switch (compoundButton.getId()) {
                case R.id.checkbox_1:
                    // ...
                    break;
                case R.id.checkbox_2:
                    // ...
                    break;
            }
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2012-04-12
      相关资源
      最近更新 更多