多選按鈕(CheckBox)——Mars Android開發視頻教程之第一季第九集(重)

##1· 什麼是多選按鈕? 像這樣能夠選中多個選項的按鈕就叫多選按鈕(CheckBox)。android

輸入圖片說明 ##2· 如何來使用多選按鈕?ide

###2.1· 添加多選按鈕 編譯器經過不一樣的id來區分CheckBox,所以要注意id的命名。 XML佈局文件:佈局

<CheckBox 
        android:id="@+id/eatBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Eat"/>

    <CheckBox 
        android:id="@+id/sleepBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Sleep"/>

    <CheckBox 
        android:id="@+id/codBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Cod"/>

    <CheckBox 
        android:id="@+id/allBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="All"/>

###2.2· 生成並獲取多選按鈕 JAVA代碼: 首先將這些多選按鈕聲明爲成員變量。code

private CheckBox eatBox;
	private CheckBox sleepBox;
	private CheckBox codBox;
	private CheckBox allBox;

而後找到其對應的組件ID對象

eatBox = (CheckBox) findViewById(R.id.eatBox);
        sleepBox = (CheckBox) findViewById(R.id.sleepBox);
        codBox = (CheckBox) findViewById(R.id.codBox);
        allBox = (CheckBox) findViewById(R.id.allBox);

###2.3· 對多選按鈕進行監聽 何時須要監聽:繼承

當按鈕被選中時; 當按鈕未選中時;接口

老師介紹了兩種監聽方法:圖片

  • 內部類實現接口OnClickListener的onClick(View view)方法;get

  • 內部類實現接口OnCheckedChangeListener的onCheckedChanged(CompoundButton boxButton, boolean isChecked) 方法;編譯器

3· 兩個方法最明顯的區別就是傳遞參數不一樣

前者傳遞一個View,後者傳遞一個CompoundButton(它是CheckBox等擁有兩種狀態的抽象的父類)和一個布爾值。這個布爾值表明所點擊的選項的狀態。

  • onClick方法是在選項被單擊的時候調用;
  • onCheckedChanged方法是在選項狀態改變的時候調用;

先建立一個內部類來實現監聽器接口,重寫指定方法: 作法1:

class BoxOnClickListener implements OnClickListener{

		public void onClick(View view) {
			
		}
    	
    }

按鈕只要被點擊,就會執行onClick方法。 這裏咱們要實現的是:知道具體哪個按鈕被選中仍是被取消選中。

CheckBox box = (CheckBox) view;//view向下轉型爲CheckBox
			switch(box.getId()){//經過id來判斷操做的是哪個CheckBox
				case R.id.eatBox:
					if(box.isChecked()) {//經過該方法來判斷CheckBox選中與否
						System.out.println("eatBox is checked");
					} else {
						System.out.println("eatBox is unchecked");
					}
					break;
					
				case R.id.sleepBox:
					if(box.isChecked()) {
						System.out.println("sleepBox is checked");
					} else {
						System.out.println("sleepBox is unchecked");
					}
					break;
					
				case R.id.codBox:
					if(box.isChecked()) {
						System.out.println("codBox is checked");
					} else {
						System.out.println("codBox is unchecked");
					}
					break;
					
				case R.id.allBox:
					if(box.isChecked()) {
						System.out.println("allBox is checked");
					} else {
						System.out.println("allBox is unchecked");
					}
					break;
					
			}

監聽器類寫好以後,再建立出該類對象,最後掛接在多選按鈕上就完成了:

BoxOnClickListener listener = new BoxOnClickListener();
        eatBox.setOnClickListener(listener);
        sleepBox.setOnClickListener(listener);
        codBox.setOnClickListener(listener);
        allBox.setOnClickListener(listener);

作法2: 繼承的接口改成OnCheckedChangeListener。以及方法改成onCheckedChanged(CompoundButton boxButton, boolean isChecked)

class BoxOnCheckedChangeListener implements OnCheckedChangeListener {

	@Override
	public void onCheckedChanged(CompoundButton boxButton, boolean isChecked) {
		
       }
}

原來的經過box.isCheckde來判斷選中與否,如今就能夠用isChecked來代替:

case R.id.eatBox:
				if(isChecked){
					System.out.println("eatBox is checked");
				} else {
					System.out.println("eatBox is unchecked");
				}
				break;

最後建立見監聽器類對象,並掛接上就完成了:

BoxOnCheckedChangeListener listener = new BoxOnCheckedChangeListener();
        eatBox.setOnCheckedChangeListener(listener);
        sleepBox.setOnCheckedChangeListener(listener);
        codBox.setOnCheckedChangeListener(listener);
        allBox.setOnCheckedChangeListener(listener);

##4· 課後練習 ###4.1· 實現全選 經過CheckBox的setChecked(Boolean)方法來實現:

case R.id.allBox:
				eatBox.setChecked(isChecked);
				sleepBox.setChecked(isChecked);
				codBox.setChecked(isChecked);
				break;

###4.2· 練習要注意的地方

  • 當每一個選項都被選中時,全選按鈕也應自動被選中:
if(eatBox.isChecked() && sleepBox.isChecked() && codBox.isChecked()) {
			allBox.setChecked(true);
		} else {...}
  • 當每一個選項都被選中時(包括全選按鈕),取消除全選按外的任意一個選項時,全選按鈕也應自動取消:
else {//由於在取消全選按鈕的時候,會把每一個選項都取消掉,因此要用一個臨時變量來保持取消前的狀態。
			boolean eatTemp = eatBox.isChecked();
			boolean sleepTemp = sleepBox.isChecked();
			boolean codTemp = codBox.isChecked();
			
			allBox.setChecked(false);
			eatBox.setChecked(eatTemp);
			sleepBox.setChecked(sleepTemp);
			codBox.setChecked(codTemp);
		}

完畢

相關文章
相關標籤/搜索