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

单选按钮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初学者的思考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值