筆者長期從事於資料庫的開發,算了,不提當年了,因為一直用的是小語種(PowerBuilder),還是來說說這兩個最常見的控制項吧! RadioButton(單選)和CheckBox(多選) 先來看看繼承關係吧 兩個還是親兄弟,是View的第四代傳人,是View的玄孫,好小呀! RadioButton必 ...
筆者長期從事於資料庫的開發,算了,不提當年了,因為一直用的是小語種(PowerBuilder),還是來說說這兩個最常見的控制項吧!
RadioButton(單選)和CheckBox(多選)- 先來看看繼承關係吧
- 兩個還是親兄弟,是View的第四代傳人,是View的玄孫,好小呀!
- RadioButton必須按組來分,而CheckBox不用,可以自由的玩耍;
- 這裡就需要引入了圈養人RadioGroup
- 這裡不難看出,圈養人是LinearLayout的兒子,那麼就可以制定方向了
- 上邊寫RadioButton必須按組來分,這裡語義上有點歧義吧,其實他可以不需要圈養人,也可以單獨存在,但是單獨存在就是去了意義,因為如果沒有RadioGroup,每個RadioButton都可以點中,互相之間沒有依賴了;
- 上代碼,熟悉下
- 佈局
<?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"
android:padding="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="請選擇你的性別"/>
<RadioGroup
android:id="@+id/rg_sex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb_man"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"/>
<RadioButton
android:id="@+id/rb_woman"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"/>
</RadioGroup>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="請選擇你的愛好"/>
<CheckBox
android:id="@+id/cb_swimming"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="游泳"/>
<CheckBox
android:id="@+id/cb_running"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跑步"/>
<CheckBox
android:id="@+id/cb_study"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="學習"/>
</LinearLayout>
- 代碼
publicclassCheckboxAndRadioBoxActivityextendsAppCompatActivityimplementsCompoundButton.OnCheckedChangeListener,
RadioGroup.OnCheckedChangeListener{
privateRadioGroup rg_sex;
privateCheckBox cb_swimming;
privateCheckBox cb_running;
privateCheckBox cb_study;
privateList<String> hobby =newArrayList<>();
@Override
protectedvoid onCreate(@NullableBundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_checkbox_and_radiobox);
rg_sex =(RadioGroup) findViewById(R.id.rg_sex);
cb_swimming =(CheckBox) findViewById(R.id.cb_swimming);
cb_running =(CheckBox) findViewById(R.id.cb_running);
cb_study =(CheckBox) findViewById(R.id.cb_study);
rg_sex.setOnCheckedChangeListener(this);
cb_swimming.setOnCheckedChangeListener(this);
cb_running.setOnCheckedChangeListener(this);
cb_study.setOnCheckedChangeListener(this);
}
@Override
publicvoid onCheckedChanged(CompoundButton buttonView,boolean isChecked){
switch(buttonView.getId()){
case R.id.cb_swimming:
if(isChecked){
hobby.add("游泳");
}else{
hobby.remove("游泳");
}
break;
case R.id.cb_running:
if(isChecked){
hobby.add("跑步");
}else{
hobby.remove("跑步");
}
break;
case R.id.cb_study:
if(isChecked){
hobby.add("學習");
}else{
hobby.remove("學習");
}
break;
}
String str="";
for(int i =0; i < hobby.size(); i++){
if(i==0){
str = hobby.get(0);
}else{
str +=","+hobby.get(i);
}
}
Toast.makeText(getApplicationContext(),"愛好:"+ str,Toast.LENGTH_SHORT).show();
}
@Override
publicvoid onCheckedChanged(RadioGroup group,int checkedId){
switch(checkedId){
case R.id.rb_man:
Toast.makeText(getApplicationContext(),"性別:男",Toast.LENGTH_SHORT).show();
break;
case R.id.rb_woman:
Toast.makeText(getApplicationContext(),"性別:女",Toast.LENGTH_SHORT).show();
break;
}
}
}
- 這裡說說當RadioGroup與CompoundButton的OnCheckedChangeListener出現衝突怎麼辦?他們的方法都是onCheckedChanged,我這裡用Activity同時實現以上兩個介面,根據參數的不同,RadioGroup與CompoundButton他們知道自己去調用自己的介面方法,雖然名稱一樣,但是參數不同呀,這裡就要理解兩個概念了
- 方法重載:方法名稱相同,與返回值無關,參數個數或者類型至少有一樣不同
- 方法覆蓋: 子類重寫了父類的方法,函數名稱,參數,返回值必須和父類一模一樣,這裡可以加註解來判斷@Override,系統可以幫你檢測方法 的正確性;
- 當初老師的說法是既然這兩個介面一樣,為什麼不寫成一個介面,這豈不是違背了面向對象的原理?我認為主要從兩方面來考慮:
- RadioGroup.OnCheckedChangeListener是對組的一個點擊改變的監聽,CompoundButton.OnCheckedChangeListener是對view組件的點擊事件改變的監聽,group可以有孩子,而後者不可以有孩子,我想這應該是本質的區別吧;
- 我想Google當初設計的還是怕把這兩個方法寫在一個介面中,擔心回調的時候出現混淆吧;