android onCheckedChanged 用于无线电组
Posted
技术标签:
【中文标题】android onCheckedChanged 用于无线电组【英文标题】:android onCheckedChanged for radiogroup 【发布时间】:2013-09-03 09:03:22 【问题描述】:我在 android 中写了一个Activity
,我在 RadioGroup 下有两个单选按钮。默认选中其中之一。但是我无法在onCreate
方法中触发事件,以便我可以在其中做一些事情。 onCheckedChanged
在点击时运行良好。
RadioGroup ItemtypeGroup = (RadioGroup) findViewById(R.id.rechargeItemtype);
RadioButton providerRadio = (RadioButton) findViewById(R.id.a);
providerRadio.performClick();
ItemtypeGroup.setOnCheckedChangeListener(new OnCheckedChangeListener()
@Override
public void onCheckedChanged (RadioGroup group,int checkedId)
Log.d("chk", "id" + checkedId);
if (checkedId == R.id.a)
//some code
else if (checkedId == R.id.b)
//some code
);
【问题讨论】:
在设置listener
后尝试输入performClick()
代码
感谢您的评论,但没有运气:(
嗯...你在listener
中设置了一个断点,以确保它不会去那里并且里面的其他东西不会搞砸吗?
已编辑。当我点击收音机时,我可以在 logcat 中看到效果。
【参考方案1】:
在初始化时触发默认的单选复选框。使用 clearCheck 方法将所有内容设置为未选中,然后设置处理程序,然后设置默认值,您的处理程序将触发。
itemtypeGroup.clearCheck();
然后像往常一样添加一个监听器...
itemtypeGroup
.setOnCheckedChangeListener(new OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
Log.d("chk", "id" + checkedId);
if (checkedId == R.id.a)
//some code
else if (checkedId == R.id.b)
//some code
);
然后检查默认单选按钮,您的侦听器将触发。
rb = (RadioButton) view.findViewById(R.id.a);
rb.setChecked(true);
祝你好运
【讨论】:
这是什么“rb = (RadioButton) view.findViewById(R.id.a);”意思是?我们必须在 onCheckedChanged 内部声明吗? 三个步骤。清除所有,连接处理程序,设置默认值。因为默认值是在监听器连接后设置的,所以监听器代码将运行。 我很抱歉投了反对票 - 这是无意的。我试图通过单击 upvote 来纠正它,但我做不到。如果您知道纠正反对票的方法,请告诉我。 NP不用担心。 @Jorvis 对于三个组+,我可能会在 checkID 上使用 switch 语句。计划所有checkedIds在APP中都是唯一的。我想我可能会使用单独的处理程序取决于应用程序。【参考方案2】: radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
if (checkedId == R.id.radioButton1)
//do work when radioButton1 is active
else if (checkedId == R.id.radioButton2)
//do work when radioButton2 is active
else if (checkedId == R.id.radioButton3)
//do work when radioButton3 is active
);
这对我有用。希望有帮助
【讨论】:
假设我有三个广播组,那么我将如何处理其中三个的听众? 所以你的意思是我应该为三个广播组实现三个不同的侦听器以及三个 onCheckedChanged 方法。 没有。您必须使用一个侦听器并检查在侦听器中选择了哪一个。【参考方案3】:试试这个代码。
在您的 onCreate 方法中声明此代码。
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radiogroup);
radioGroup.clearCheck();
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
RadioButton rb = (RadioButton) group.findViewById(checkedId);
if (null != rb && checkedId > -1)
// checkedId is the RadioButton selected
switch (checkedId)
case R.id.one:
// Do Something
break;
case R.id.two:
// Do Something
break;
case R.id.three:
// Do Something
break;
);
希望这会有所帮助。
【讨论】:
【参考方案4】:问题是因为,你在设置 OnCheckedChangeListener
on RadioGroup
在 providerRadio.performClick();
方法调用之后.这就是为什么当providerRadio.performClick();
方法执行到那时他们没有OnCheckedChangeListener
可供调用。因此,要使其正常工作,您需要在调用 performClick()
方法之前设置 Listener。
而不是使用RadioButton.performClick()
,您应该使用RadioGroup.check()
方法来更改当前选中的RadioButton
。
因此您可以使用此代码更改 RadioGroup 的当前选择
RadioGroup ItemtypeGroup = (RadioGroup) findViewById(R.id.rechargeItemtype);
ItemtypeGroup
.setOnCheckedChangeListener(new OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
Log.d("chk", "id" + checkedId);
if (checkedId == R.id.a)
//some code
else if (checkedId == R.id.b)
//some code
);
ItemtypeGroup.check(R.id.a);
注意:-
确保调用 RadioGroup.check()
方法后添加 OnCheckedChangeListener
如上代码sn-p中。
【讨论】:
【参考方案5】:我猜你是在为组设置监听器之前执行点击,这就是没有触发事件的原因。
【讨论】:
【参考方案6】:尽管@dannys answer 没问题,但我希望默认值 取自 XML 布局定义文件,而不是设置它在代码中。
这就是我使用这种方法的原因:
-
存储无线电组的默认值
清除所有支票
初始化
OnCheckedChangeListener
再次检查触发监听器的默认值(之前存储的)
在将first_radio_button
作为默认单选按钮的代码中可能如下所示:
// call this in any init method
_myRadioGroup = _myViewContainingTheRadioGroup.findViewById(R.id.my_radio_group);
int defaultValue = _myRadioGroup.getCheckedRadioButtonId();
_myRadioGroup.clearCheck();
_myRadioGroup.setOnCheckedChangeListener(_myRadioGroupCheckedChangeListener);
_myRadioGroup.check(defaultValue);
将OnCheckedChangeListener
放在班级的某处:
private RadioGroup.OnCheckedChangeListener _myRadioGroupCheckedChangeListener = new RadioGroup.OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
switch(group.findViewById(checkedId).getId())
case R.id.first_radio_button:
// do stuff
break;
case R.id.second_radio_button:
// do stuff
break;
// ...
;
这是我的电台组 xml
<RadioGroup
android:id="@+id/my_radio_group"
android:layout_
android:layout_
android:orientation="horizontal">
<RadioButton
android:id="@+id/first_radio_button"
android:layout_
android:layout_
android:checked="true"
android:text="@string/first_radio_button_text"/>
<RadioButton
android:id="@+id/second_radio_button"
android:layout_
android:layout_
android:text="@string/second_radio_button_text"/>
// ...
</RadioGroup>
【讨论】:
以上是关于android onCheckedChanged 用于无线电组的主要内容,如果未能解决你的问题,请参考以下文章
为啥android的checkbox的setChecked方法不触发onCheckedChanged事件
android studio 无法通过匿名内部类调用oncheckedchanged方法
Android编程如何在onCheckedChanged(CompoundButton arg0, boolean arg1)中限制CheckBox的选择数量。
android开发中setOnCheckedChangeListener监听的问题(高手进)
android开发中switch在切换开/关状态时,先弹出一个dialog(确认/取消)以让用户确认是不是切换开/关状态