在Android開發中我們經常會使用CheckBox控件,那么怎么實現CheckBox控件的全選,反選呢
首先布局我們的界面:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <TextView android:id="@+id/textviewtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="平時喜歡做什么事情?" /> <CheckBox android:id="@+id/checkboxall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/textviewtitle" android:layout_alignTop="@id/textviewtitle" android:layout_toRightOf="@id/textviewtitle" android:text="全選" /> <!--內容的CheckBox--> <CheckBox android:id="@+id/checkbox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/textviewtitle" android:layout_marginRight="80dp" android:text="玩游戲" /> <CheckBox android:id="@+id/checkbox2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/textviewtitle" android:layout_toRightOf="@+id/checkbox1" android:text="學習" /> <CheckBox android:id="@+id/checkbox3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/checkbox1" android:text="敲代碼" /> <CheckBox android:id="@+id/checkbox4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/checkbox2" android:layout_toRightOf="@+id/checkbox1" android:text="跑步" /> <CheckBox android:id="@+id/checkbox5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/checkbox3" android:text="游泳" /> <CheckBox android:id="@+id/checkbox6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/checkbox4" android:layout_toRightOf="@+id/checkbox1" android:text="睡覺" /> <TextView android:id="@+id/textviewinfo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/checkbox5" android:layout_marginTop="20dp" android:text="已選擇:"/> </RelativeLayout>
注意要給對應的CheckBox編寫Id,
接下來就是java代碼了:代碼主要實現的功能,點擊全選按鈕時,我會
把所有的選項選中,在全選的情況下,我取消任意一個復選框,那么全選按鈕也會取消選中,同理,我選中了所有的復選框后,其全選按鈕也會選中。
代碼如下:
package com.dc.work3; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import android.widget.Toast; import java.util.LinkedList; import java.util.List; /** * Created by 丁先森 */ public class MainActivity2s extends AppCompatActivity { private CheckBox checkboxall; private CheckBox checkBox1; private CheckBox checkBox2; private CheckBox checkBox3; private CheckBox checkBox4; private CheckBox checkBox5; private CheckBox checkBox6; private TextView textviewinfo; private List<String> checkedStr; //操作取消一個時,全選取消,這個變量是是否是用戶點擊 private boolean checkFoUser=true; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_2); checkboxall = (CheckBox) findViewById(R.id.checkboxall); checkBox1 = (CheckBox) findViewById(R.id.checkbox1); checkBox2 = (CheckBox) findViewById(R.id.checkbox2); checkBox3 = (CheckBox) findViewById(R.id.checkbox3); checkBox4 = (CheckBox) findViewById(R.id.checkbox4); checkBox5 = (CheckBox) findViewById(R.id.checkbox5); checkBox6 = (CheckBox) findViewById(R.id.checkbox6); textviewinfo = (TextView) findViewById(R.id.textviewinfo); checkBox1.setOnCheckedChangeListener(changeListener); checkBox2.setOnCheckedChangeListener(changeListener); checkBox3.setOnCheckedChangeListener(changeListener); checkBox4.setOnCheckedChangeListener(changeListener); checkBox5.setOnCheckedChangeListener(changeListener); checkBox6.setOnCheckedChangeListener(changeListener); checkboxall.setOnCheckedChangeListener(changeListener); checkedStr=new LinkedList<>(); } public CompoundButton.OnCheckedChangeListener changeListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { switch (buttonView.getId()){ case R.id.checkbox1: case R.id.checkbox2: case R.id.checkbox3: case R.id.checkbox4: case R.id.checkbox5: case R.id.checkbox6: String str=buttonView.getText().toString(); if(isChecked){ checkedStr.add(str); }else { checkedStr.remove(str); } // checkFoUser=false; checkboxall.setOnCheckedChangeListener(null); if(checkBox1.isChecked()&&checkBox2.isChecked()&&checkBox3.isChecked()&&checkBox4.isChecked()&&checkBox5.isChecked()&&checkBox6.isChecked()){ //表示如果都選中時,把全選按鈕也選中 checkboxall.setChecked(true); }else { //否則就全選按鈕去不選中,但是這樣會觸發checkboxall的監聽,會把所有的都取消掉 checkboxall.setChecked(false); } // checkFoUser=true; /*第二種方法*/ checkboxall.setOnCheckedChangeListener(changeListener); break; case R.id.checkboxall: if(checkFoUser) { checkBox1.setChecked(isChecked); checkBox2.setChecked(isChecked); checkBox3.setChecked(isChecked); checkBox4.setChecked(isChecked); checkBox5.setChecked(isChecked); checkBox6.setChecked(isChecked); break; } } StringBuffer sb=new StringBuffer(); for(String str:checkedStr){ sb.append(str+","); } if(sb.length()>0){ //設置長度為長度-1,去除最后的“,” sb.setLength(sb.length()-1); } textviewinfo.setText("已選擇:"+sb.toString()); } }; }
寫的不是很好,但是可以簡單的解決問題,歡迎大家積極交流,留下寶貴的建議,共同學習!
