Bmi專案功能與事件處理,什麼是onClick屬性?

按鈕的事件處理

使用者與APP中的UI元件互動時,元件會產生各類型的事件(Event),例如點擊、長按、觸碰等事件,在Android中,這些事件由專門處理的「事件傾聽器(Event Listener)」負責監聽,最常見的是元件被按下事件的「View.ClickListener」,它是View類別內所設計的Java介面,宣告了一個方法:

public void onClick(View v);

所有實作ClickListener的類別都須一併實作這個方法,先將ClickListener指派到一個特定元件(如Button),未來,當Button被按下時,會自動執行ClickListener內的onClick方法。通常事件傾聽器會以「匿名類別(Anonymouse Inner Class)」方式設計,匿名類別寫法會在本章後續介紹,筆者先談的是使用方便的onClick屬性。

使用onClick屬性

假設一個畫面中有很多個按鈕,每個按鈕都實作一個事件傾聽者去監聽事件是一個很繁複的工作,因此,Android對於Click事件有特殊的對待,可以在元件屬性onClick設定一個方法名稱,再到MainActivity類別中設計一個同名的方法,方法規格如下:

public void 方法名稱(View v){
   //按下按鈕時需執行的程式碼
}

接下來實作範例的Bmi運算按鈕的事件處理,在activity_main.xml的設計畫面中,選擇「Calculate BMI」按鈕,再到屬性區找到「onclick」屬性,輸入「bmi」,如下圖:

輸入完成後再開啟MainActivity.java,新增一個bmi方法,Java類別的方法應在類別內的第一層新增,如下圖:

class MainActivity extends AppCompatActivity {
    ...
    public void bmi(View v){
       //取得元件的值並計算BMI
    }
}

在輸入View類別時,未打完時會出現下拉選單,請使用選單完成View類別的輸入,Android Studio會自動加入import語法。未來,當使用者按下此按鈕時,會自動執行bmi方法內的程式碼。

提示:
請儘量使用下拉選單完成類別的輸入,因為類別大都需要import語法,如果直接打完,import語法不會自動產生。

在bmi方法中,設計以下程式碼以計算出BMI值,如下:

public void bmi(View v){
    String w = edWeight.getText().toString();
    String h = edHeight.getText().toString();
    weight = Float.parseFloat(w);
    float height = Float.parseFloat(h);
    float bmi = weight/(height*height);
    Log.d("BMI", String.valueOf(bmi));
}

程式碼的2與3行呼叫EditText的getText()方法取得一個Editable的物件,再呼叫其toString方法取得目前輸入方塊中的字串。第4與5行呼叫Float類別的靜態方法parseFloat,將字串轉換為float型態,最後以體重/身高2的公式算出bmi值。

最後的第7行,使用android.util.Log類別,將浮點數bmi轉換為字串後,顯示在系統記錄(LogCat),LogCat是Android開發人員用來除錯的工具,可在執行時顯示資料並驗證程式的正確性。Log類別提供了數個靜態方法,可供產生不同層級的記錄資料,例如代表除錯用的d方法(debug)、資訊的i方法(info)、代表錯誤的e方法(error)等,以英文字的第一個字母為命名方式,可簡化程式碼的長度。這些方法使用上大致相同,以d除錯方法為例,規格如下:

Log.d( String tag, String message)

第一個參數代表標籤Tag,為這個訊息設定一個可供辨認的標籤值,方便未來在Log視窗中找到訊息,第二個參數則是想顯示的字串訊息,以上範例的執行結果如下:

按下畫面中的「CALCULATE BMI」按鈕後會自動去執行MainActivity內的bmi方法,計算後得到bmi值並在下方的LogCat視窗中顯示,如下圖:

Tip:
「LogCat」是由Android開發工具所提供,讓開發者能夠觀察系統產生的除錯資訊與記錄。當應用程式出錯拋出例外時,可利用LogCat找到出錯的原因。

使用Log類別可在開發時期提供資料確認、除錯的訊息,但無法將資訊提供給APP使用者,接下來將利用浮動顯示方式告知使用者運算出的BMI值的結果。

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *