具有Togglebuttons的Radiogroup无法正常工作

时间:2012-12-10 14:17:56

标签: android radio-button listener togglebutton oncheckedchanged

我尝试用四个togglebuttons实现一个radiogroup。所需的行为是典型的无线电组行为:预选一个按钮,如果用户单击另一个按钮,则取消选择前一个按钮,而选择新的按钮。如果用户再次单击所选按钮,则不会发生任何事情,因为不允许选择任何按钮。那就是我遇到问题的地方。我按照这个问题的解决方案:Android: How to get a radiogroup with togglebuttons?

不幸的是,用户仍然可以取消选择活动按钮。我该如何防止这种情况?

继承我的代码:

ToggleButtons的onClick侦听器:

/**
 * Handler for onClick Events.
 */
    @Override
public void onClick(View v) {
    if (viewListener == null) {
        return;
    }
    if (v == tb_one|| v == tb_two|| v == tb_three|| v == tb_four) {
        ((RadioGroup) v.getParent()).check(v.getId());
    }
    else {
        super.onClick(v);
    }

}

我的自定义OnCheckedChangeListener:

/**
 * The listener for a checked change event of the toggle buttons.
 */
static final RadioGroup.OnCheckedChangeListener ToggleListener = new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(final RadioGroup radioGroup, final int i) {
        //if one button is checked, uncheck all others
        for (int j = 0; j < radioGroup.getChildCount(); j++) {
            final ToggleButton view = (ToggleButton) radioGroup.getChildAt(j);
            view.setChecked(view.getId() == i);
        }
    }
};

继续我添加监听器的地方:(它在onFinishInflate方法中)

    ((RadioGroup) findViewById(R.id.instant_toggleGroup_mode))
            .setOnCheckedChangeListener(ToggleListener);
    tb_one = (ToggleButton) findViewById(R.id.instant_tb_one);
    tb_one.setOnClickListener(this);
    tb_two = (ToggleButton) findViewById(R.id.instant_tb_two);
    tb_two.setOnClickListener(this);
    tb_three = (ToggleButton) findViewById(R.id.instant_tb_three);
    tb_three.setOnClickListener(this);
    tb_four = (ToggleButton) findViewById(R.id.instant_tb_four);
    tb_four.setOnClickListener(this);

如果有人可以向我指出解决方案,那会很棒!

2 个答案:

答案 0 :(得分:2)

最后我想出了如何做到这一点。谢谢Ole,你的帮助让我得到了这个解决方案。

所以这是工作代码:

初始化按钮和按钮组:

tb_one = (ToggleButton) findViewById(R.id.instant_tb_one);
tb_one.setOnClickListener(this);
tb_two = (ToggleButton) findViewById(R.id.instant_tb_two);
tb_two.setOnClickListener(this);
tb_three = (ToggleButton) findViewById(R.id.instant_tb_three);
tb_three.setOnClickListener(this);
tb_four = (ToggleButton) findViewById(R.id.instant_tb_four);
tb_four.setOnClickListener(this);
rg_modes = (RadioGroup) findViewById(R.id.instant_toggleGroup_mode);
rg_modes.setOnCheckedChangeListener(ToggleListener);
rg_modes.clearCheck();
rg_modes.check(tb_one.getId());

onClick处理程序:

if (v == tb_one|| v == tb_two|| v == tb_three|| v == tb_four) {
  rg_modes.clearCheck();
  rg_modes.check(v.getId());
}

答案 1 :(得分:0)

检查ToggleButton是否已经过检查。如果是,你什么都不做。

if (v == tb_one|| v == tb_two|| v == tb_three|| v == tb_four) {
    if(!((ToggleButton) v).isChecked())
        ((RadioGroup) v.getParent()).check(v.getId());
}

修改

if (v == tb_one|| v == tb_two|| v == tb_three|| v == tb_four) {
    ((RadioGroup) v.getParent()).check(v.getId());

    if(!((ToggleButton) v).isChecked())
        ((ToggleButton) v).setChecked(true);
}