Android: прослушиватель флажков

Я хочу поместить Listener поверх CheckBox. Я искал информацию, и она такая:

satView = (CheckBox)findViewById(R.id.sateliteCheckBox);

satView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        if (isChecked){
            // perform logic
        }
    }

});

Проблема в том, что Eclipse думает, что это OnCheckedChangeListener вместо RadioGroup, и это не работает. Как я могу это исправить?


person Roman Rdgz    schedule 05.12.2011    source источник


Ответы (10)


Ты можешь это сделать:

satView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

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

       }
   }
);     
person Chris    schedule 05.12.2011
comment
Спасибо, и вот как это удалить: stackoverflow.com/questions/ 18881817/ - person Michal; 27.01.2014
comment
OnCheckedChangeListener и CompoundButton.OnCheckedChangeListener разные. - person zionpi; 30.04.2015
comment
for kotlin satView.setOnCheckedChangeListener { buttonView, _ -> if (buttonView.isChecked) { // выполнить действие } else { // выполнить действие } } - person Aminul Haque Aome; 18.11.2019

вы также можете использовать простой View.OnClickListener:

satView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(((CompoundButton) view).isChecked()){
            System.out.println("Checked");
        } else {
            System.out.println("Un-Checked");
        }
    }
});
person Community    schedule 05.12.2011
comment
Это действительно только одно рабочее решение, когда я хотел прослушать флажок нажать действие, а не его состояние, как рекомендуют другие решения. - person Acuna; 17.12.2017

Вы получаете сообщение об ошибке, потому что вы импортировали неправильный пакет. Вам следует import android.widget.CompoundButton.OnCheckedChangeListener;

Таким образом, обратный вызов должен быть:

        box.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub

        }
    });
person Huang    schedule 05.12.2011

Попробуй это:

satView = (CheckBox) findViewById(R.id.sateliteCheckBox);

satView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          if (buttonView.isChecked()) { 
                // checked
          } 
          else 
          {
                // not checked
          }
    }

});

Надеюсь это поможет.

person oriolpons    schedule 05.12.2011

Перевод принятого ответа Криса на Котлин:

val checkBox: CheckBox = findViewById(R.id.chk)
checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
    // Code here 
}
person Elletlar    schedule 25.04.2018
comment
Примечание. Если buttonView не используется: { _, isChecked -> - person Elletlar; 25.04.2018

попробуй это

satView.setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            if (isChecked){
                // perform logic
            }
        }

    });
person confucius    schedule 05.12.2011

Замените RadioGroup group на CompoundButton buttonView, а затем нажмите Ctrl+Shift+O, чтобы исправить импорт.

person SERPRO    schedule 05.12.2011

Вы можете использовать этот код.

public class MySampleActivity extends Activity {
    CheckBox cb1, cb2, cb3, cb4;
    LinearLayout l1, l2, l3, l4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        cb1 = (CheckBox) findViewById(R.id.cb1);
        cb2 = (CheckBox) findViewById(R.id.cb2);
        cb3 = (CheckBox) findViewById(R.id.cb3);
        cb4 = (CheckBox) findViewById(R.id.cb4);
        l1 = (LinearLayout) findViewById(R.id.l1);
        l2 = (LinearLayout) findViewById(R.id.l2);
        l3 = (LinearLayout) findViewById(R.id.l3);
        l4 = (LinearLayout) findViewById(R.id.l4);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        cb1.setOnCheckedChangeListener(new MyCheckedChangeListener(1));
        cb1.setOnCheckedChangeListener(new MyCheckedChangeListener(2));
        cb1.setOnCheckedChangeListener(new MyCheckedChangeListener(3));
        cb1.setOnCheckedChangeListener(new MyCheckedChangeListener(4));
    }

    public class MyCheckedChangeListener implements CompoundButton.OnCheckedChangeListener {
        int position;

        public MyCheckedChangeListener(int position) {
            this.position = position;
        }

        private void changeVisibility(LinearLayout layout, boolean isChecked) {
            if (isChecked) {
                l1.setVisibility(View.VISIBLE);
            } else {
                l1.setVisibility(View.GONE);
            }

        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            switch (position) {
                case 1:
                    changeVisibility(l1, isChecked);
                    break;
                case 2:
                    changeVisibility(l2, isChecked);
                    break;
                case 3:
                    changeVisibility(l3, isChecked);
                    break;
                case 4:
                    changeVisibility(l4, isChecked);
                    break;
            }
        }
    }
}
person Arun Shankar    schedule 07.08.2015
comment
Почему вы передаете «LinearLayout» в свой метод «changeVisibility (макет LinearLayout, логическое значение isChecked)», но каждый раз вы меняете видимость только одного макета? - person Bradley Wilson; 05.02.2018

Если вы хотите сделать это в Kotlin с реализацией интерфейса.

class MainActivity: AppCompatActivity(),CompoundButton.OnCheckedChangeListener{

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

      val yourCheckBox = findViewById<CheckBox>(R.id.check_box)
      yourCheckBox.setOnCheckedChangeListener(this)

    }

 override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
        when(buttonView?.id){
            R.id.check_box -> Log.d("Checked: ","$isChecked")
        }
    }

}
person Gastón Saillén    schedule 07.07.2019

person    schedule
comment
Добро пожаловать в Stack Overflow! Вы можете улучшить этот ответ, отредактировав его, чтобы объяснить, как он работает. - person dorukayhan; 20.08.2016