2016-11-17 80 views
0

我已將點擊事件偵聽器設置爲CheckBoxRadioButton視圖。這兩種視圖類型都有一個isChecked()方法。我可以通過爲每個單個開關案例投射它的類型來獲得其中任一個的狀態,但是在進入開關案例之前,我是否可以獲得其中任何一個的一般意義上的狀態?從CheckBox或RadioButton獲取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,但有太多的代碼有對我來說,很容易理解,如果他們在問同樣的事情。

雖然我正在寫這個問題的過程中,我找到了答案,我將在下面發佈。但是,如果有更好的答案,我會接受它。

回答

0

直接回答

由於@MikeM在評論中回答,您可以使用instanceofCompoundButtonCheckable,並投給檢查一次。

@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添加到RadioGroupCompoundButton.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無論什麼RadioButton ID是由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; 
     } 
    } 
}; 
1

考慮一個單選按鈕和一個複選框

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

您需要接受ch對所有聽衆的意見

+0

對於工作答案+1。不過,我認爲最好爲單選按鈕和複選框使用不同的監聽器。看到我更新的答案。 – Suragch