2016-11-17 18 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はコメントで答えとして、あなたはCompoundButtonCheckableのために一度チェックして、それにキャストするinstanceofを使用することができます。 @MikeMも述べたように

@Override 
public void onClick(View view) { 

    boolean checkState = false; 
    if (view instanceof Checkable) { 
     checkState = ((Checkable) view).isChecked(); 
    } 

    switch (view.getId()) { 
     // ... 
    } 
} 

良い答え

しかし、あなたはOnCheckedChangeListenerではなくOnClickListenerを使用する必要があります。

CompoundButtonリスナー

CheckBoxまたは RadioButtonのために使用することができます:2人の類似確認変更リスナーがあります。しかし、 RadioGroupのすべてのラジオボタンがこのセットを持っていた場合、リスナーは2回呼び出されます。1回はボタンがオフになり、1回はオンになります。したがって、ラジオボタンにはリスナーを使用することをお勧めします( RadioGroup)。

RadioGroup.OnCheckedChangeListenerRadioGroupに、CompoundButton.OnCheckedChangeListenerCheckBoxにそれぞれ追加してください。

ラジオボタン

isChecked()値はRadioButton idがRadioGroupリスナーによって返されるどんなためtrueで次のようにリスナーが実装されて

// 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.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

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のRadioButtonと1つの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(); 
      } 
     } 
}; 

を持って考えてみましょう

あなたはattaする必要がありますこのリスナーへのすべてのビューのチャンネル

+0

+1私はラジオボタンとチェックボックスに異なるリスナーを使用する方が良いと判断しました。私の更新された答えを見てください。 – Suragch

関連する問題