单选按钮radio例子:
RadioButton应该定义在RadioGroup中,组中只能选一个
跟html中
<input type="radio" name="gender" value="female"/>女
<input type="radio" name="gender" value="male"/>男
是一样的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RadioGroup
android:id="@+id/genderGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<RadioButton
android:id="@+id/femaleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/female"
/>
<RadioButton
android:id="@+id/maleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/male"
/>
</RadioGroup>
</LinearLayout>
取得Radio的值例子:
public class RadioActivity extends Activity {
private RadioButton femaleButton;
private RadioButton maleButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.radio);
RadioGroup genderGroup=(RadioGroup) findViewById(R.id.genderGroup);
femaleButton=(RadioButton) findViewById(R.id.femaleButton);
maleButton=(RadioButton) findViewById(R.id.maleButton);
//给RadioGroup添加一个监听器,监听值的变化
genderGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(checkedId==femaleButton.getId()){
Toast.makeText(getApplicationContext(), "female", 1).show();
}else if(checkedId==maleButton.getId()){
Toast.makeText(getApplicationContext(), "male", 1).show();
}
}
});
}
}
<CheckBox
android:id="@+id/swim"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/swim"
/>
<CheckBox
android:id="@+id/run"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/run"
/>
<CheckBox
android:id="@+id/read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/read"
/>
得到复选按钮选中的值
public class CheckBoxActivity extends Activity {
private CheckBox swimBox;
private CheckBox runBox;
private CheckBox readBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.radio);
swimBox=(CheckBox) findViewById(R.id.swim);
runBox=(CheckBox) findViewById(R.id.run);
readBox=(CheckBox) findViewById(R.id.read);
//给各个CheckBox 设置监听器
swimBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
Toast.makeText(getApplicationContext(), "swim", 1).show();
}
}
});
runBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
Toast.makeText(getApplicationContext(), "run", 1).show();
}
}
});
readBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
Toast.makeText(getApplicationContext(), "read", 1).show();
}
}
});
}
}
关于mars视频上,mars提出的对CompoundButton.OnCheckedChangeListener和RadioGroup.OnCheckedChangeListener两个接口为什么不合并的问题
我提一些自己的观点
我认为这两个接口本来就不应该合并,原因如下
根据文档,我们可以看出CompoundButton是CheckBox和RadioBox的父类,而RadioGroup的直接父类居然是LinearLayout
RadioGroup从父类继承的字段有HORIZENAL,VERTICAL
从父类继承的方法有setGravity(),setOrientation()等等
于是可以认为RadioGroup就是一个嵌套在外层Layout中的Layout
而RadioGroup之所以能实现众多radioButton的单选问题,是因为它维护了一个mCheckedId字段 记录了现在选中的RadioButton的id(见源码)。可以料想,安卓内部是根据这个id来做radio是否选中的显示的。
正因为如此,RadioGroup.OnCheckedChangeListener中onCheckedChanged方法才是这样的:(参数是RadioGroup和checkedId)
public void onCheckedChanged(RadioGroup group, int checkedId);
这样我们就可以通过group这个参数来操作同组其他radio的的状态(比如可以group.findViewById(...) 然后调用setEnabled(false)来灰化这个按钮.或者设置所有的radio无效,等等)
总之,我想说,radiogroup中的所有的RadioButton是在组内相关的,RadioGroup维护了组内radiobutton的相关性
CompoundButton.OnCheckedChangeListener中onCheckedChanged方法是这样的:
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked);(参数是buttonView(也就是checkbox)和checkedId)
两个接口虽然同名,接口定义的方法虽然也同名,但是参数不一样,所以指示的功能不一样,所以他们是不一样的方法,所以可以认为是不一样的接口。
如果两个接口合并了,也就是RadioGroup中不定义这个Listener,而直接用RadioButton父类CompoundButton的Listener。那么RadioButton就不能得到其他radio的状态,得不到这个组的状态,和checkbox又有什么区别呢?
或许有的人要说,在checkbox的listener中也能得到其他checkbox的状态,只要通过父类View的findViewById()就行了,这样看来radiobutton如果用checkbox的监听也是可以实现单选功能的。但是在我看来,这种方案使得代码糅杂,radio的逻辑是N只能选1,这样的底层的逻辑却在实现层去做,这样的设计谁都不能接受吧。
所以我认为android设计RadioGroup是必要的,给RadioGroup定义一个属于自己、满足radio单选功能的内部监听接口也是必要的。
综上:CompoundButton的OnCheckedChangeListener只是碰巧和RadioGroup的OnCheckedChangeListener重名罢了,因为是不同的功能,所以谈不上合并
我相信这个问题肯定有更好的方法来解读~以上只是一个Android初学者的思考