1. 程式人生 > Android入門教學 >按鈕 Button/ImageButton

按鈕 Button/ImageButton

1. Button 的基本用法

Button,顧名思義,就是一個提供給使用者點選的控制元件。同 EditText 一樣,它也是繼承自 TextView,擁有 TextView 的全部屬性,這裡重點講講 Button 特有的及常用的屬性的用法。

下面我們通過 XML 定義了一個 Button:

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/btn_click"
    android:layout_width="match_parent"
    android:layout_height
="wrap_content" android:text="點我" android:onClick="onClick" android:textColor="@android:color/holo_blue_dark" />

基本用法和 TextView 類似,這裡多了一個android:onClick屬性,從名字上看應該是設定一個點選事件。那麼我們首先看看 Button 最重要的功能,如何給 Button 繫結點選事件接收器,從而完成 Button 點選事件的接收及處理。

2. 點選事件的繫結

2.1 靜態繫結

第一種方式是通過onClick屬性實現,xml 佈局程式碼如上。我們需要給onClick

屬性設定一個函式“onClick”(函式名任意),用於接收點選事件,所以我們要在 Activity 裡面新增一個名為onClick的方法,如下:

 public void onClick(View v) {
        Toast.makeText(MainActivity.this, "button click", Toast.LENGTH_SHORT).show();
    }

這裡要特別注意函式簽名,需要指定為public void型別,而入參是View型別,傳入的 View 就是被點選的 Button 物件。這樣我們可以給多個 Button 繫結同一個 click 函式,然後通過傳入的 View 來區分點選是哪個 Button 被點選從而執行相應操作。

執行之後,點選 Button 效果如下:

onClick屬性示例

點選之後在螢幕下方打印出的文字就是我們在 xml 中為 Button 設定的 id,從而可以確認兩件事:

  • 通過onClick屬性,我們可以為 Button 指定一個點選相應函式,按照指定的方法簽名實現這個響應函式,即可接收點選事件;
  • 點選 Button 之後,會將被點選的 Button 通過引數的形式傳給onClick函式。

2.2 動態繫結

通過xml的onClick屬性靜態繫結的方式不夠靈活,而且要求繫結的函式名、引數等完全一致,出錯率也比較高,所以在實際開發中用的很少,絕大多數場景都會通過 Java 程式碼動態繫結一個事件監聽器。

動態繫結監聽器的主要程式碼如下:

package com.emercy.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.btn_click);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "button click", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

如果你對 Activity 還比較生疏也沒關係,在後面的課程會詳細講解,這裡重點看看和 Button 有關的程式碼。

  1. 首先我們設定佈局檔案為只含有一個 Button 的 xml 檔案;
  2. 接著通過 ID 獲取到 Button 例項;
  3. 通過setOnClickListener函式設定一個點選事件監聽器;
  4. 在監聽器的 onClick 回撥中接收點選事件並處理。

通過以上程式碼可以達到同樣的效果,在onClick(View view)回撥中傳入的 View 同樣是被點選的Button物件,在回撥中可以由不同的 ID 區分不同的處理邏輯。這是 Button 最常用的方式,必須掌握。

3. Button 的樣式

不同的系統會有不同的預設 Button 樣式,但是它們都有一個共同點——醜。相比於 TextView 而言,Button 是一個互動感很強的控制元件,除了設定字型字號,還需要有形狀、背景、顏色、點選態等等樣式變化。特別是在遊戲及娛樂類 App 中 ,Button 的樣式及變化效果將直接影響使用者體驗,所以這裡將重點講解幾種設定樣式的方法。

3.1 設定背景

可以有兩種設定方式:1、設定背景色;2、設定背景圖。兩種方式都可以通過 xml 及 Java 設定,在 xml 中可以通過:

android:background="#E4BB18"

可以直接設定顏色或者背景圖片,也可以在 Java 程式碼中通過如下兩個介面實現:

setBackground();
setBackgroundResource();

3.2 設定形狀樣式

和 TextView 類似,我們首先建立 drawable 資源:

依次進入“src” -> “main” -> “res” -> “drawable”目錄,在裡面右鍵新建一個“Drawable Resource File”,輸入檔名:button_background。

編寫 button_background.xml 的內容如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#B9B911" />
    <corners
        android:bottomLeftRadius="30dp"
        android:bottomRightRadius="30dp"
        android:topLeftRadius="30dp"
        android:topRightRadius="30dp" />
    <stroke
        android:width="3dp"
        android:color="#99CCFF" />
</shape>

在 shape 標籤中,我們設定了

  1. 填充的背景色
  2. 拐角的弧度
  3. 描邊的顏色和寬度

然後在xml中通過android:background設定 button 的 background 樣式:

android:background="@drawable/button_background"

效果如下:

Button樣式示例

3.3 多狀態變化

Button 的多狀態變化是很常用也是效果非常棒的一個效果,它的可以最大化的增強互動感。通過 StateListDrawable 設定 Button 在不同狀態下的樣式效果,比如在按下、抬起、選中、無效等等不同狀態下可以呈現不同的形狀和顏色,這樣可以給使用者更多的點選反饋。

StateListDrawable 用來記錄各個狀態列表,並通過 Drawable 的形式描述各個狀態下要呈現的樣式。它支援以下設定項:

  • drawable: Button 的背景樣式,搭配後面的狀態使用表示當前狀態下的樣式。如果沒有設定狀態,則為預設樣式
  • state_pressed: 按下態
  • state_enabled: 可用狀態
  • state_focused: 獲得焦點狀態
  • state_window_focused: 獲得視窗焦點狀態
  • state_checkable: 可選狀態(針對 checkbox)
  • state_checked: 勾選態
  • state_selected: 選擇態(針對滾輪的場景)
  • state_active: 活動狀態(針對 slidingTab)
  • state_single: 包含多個子控制元件時,只顯示一個子控制元件的狀態
  • state_first: 包含多個子控制元件時,第一個子控制元件處於顯示狀態
  • state_middle: 包含多個子控制元件時,中間一個子控制元件處於顯示狀態
  • state_last: 包含多個子控制元件時,最後一個子控制元件處於顯示狀態

其中最常用就是前 3 個狀態。

我們新增一個 button_pressd_background.xml,內容如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#DF866B" />
    <corners
        android:bottomLeftRadius="50dp"
        android:bottomRightRadius="50dp"
        android:topLeftRadius="50dp"
        android:topRightRadius="50dp" />
    <stroke
        android:width="3dp"
        android:color="#99CCFF" />
</shape>

我們在之前的樣式上修改了定點的弧度及背景顏色,希望他在點選的時候能夠變成新的樣式,接下來還需要一個 StateListDrawable 檔案。我們仍然在 drawable 目錄下建立檔案:button_selector.xml,程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_pressd_background" android:state_pressed="true" />
    <item android:drawable="@drawable/button_background" />
</selector>

這裡採用<selector/>標籤,直譯過來就是“選擇器”,即在不同狀態下選擇哪種樣式。最後我們將 Button 的android:background屬性指向 button_selector.xml 檔案:

    android:background="@drawable/button_selector"

大功告成,這時候只需要輕輕點選 Button,就會發現神奇的現象:

Button點選態

這樣是不是更有互動感?採用 StateListDrawable 還可以指定很多的狀態變化,這裡就留給大家去發明創造。

4 小結

本節講解了 Button 的基本用法,其中最核心的就是設定點選事件監聽器來接收使用者點選事件,其實在我們日常的實戰開發中,不僅僅是 Button 可以繫結監聽器,TextView、EditText 都可以,感興趣的小夥伴也可以嘗試修改前幾節的例子,加上監聽器試試,希望大家在學習每一個 View 的時候都能夠融會貫通,舉一反三。