从CheckBox或RadioButton获取isChecked()值

时间:2016-11-17 02:19:05

标签: android checkbox radio-button

我已在多个CheckBoxRadioButton视图中设置了click事件侦听器。这两种视图类型都有isChecked()方法。我可以通过为每个开关盒铸造它的类型来获得任何一个的状态,但是在进入开关盒之前我能否在一般意义上得到它们中的任何一个状态?

@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有类似的标题,但是有太多的代码让我很容易理解他们是否在问同样的事情。

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

2 个答案:

答案 0 :(得分: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 :(得分:0)

直接回答

正如@MikeM在评论中回答的那样,您可以使用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);
// ...

监听器的实现方式如下:

广播按钮

对于isChecked()侦听器返回的true ID,RadioButton值为RadioGroup

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;
        }
    }
};