【Android学习笔记】RadioGroup,RadioButton的使用&CheckBox的使用

来源:互联网 发布:淘宝如何开店铺步骤 编辑:程序博客网 时间:2024/05/17 23:54

单选按钮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;@Overrideprotected 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() {@Overridepublic 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;@Overrideprotected 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() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){Toast.makeText(getApplicationContext(), "swim", 1).show();}}});runBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){Toast.makeText(getApplicationContext(), "run", 1).show();}}});readBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic 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初学者的思考

0 0