My Calendar

2014年6月15日 星期日

Android 程式開發(四)

Android 程式開發(四)

在 Android程式開發 (三) 中已經將BMI程式所需要的UI Components都已經建立好。接下來將開始BMI的程式設計。以下是BMI完整的程式。

package com.example.bmi;

import java.text.DecimalFormat;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  initViews();
  setListener();  
 }
 
 private Button button_calc;
 private EditText num_height;
 private EditText num_weight;
 private TextView show_result;
 private TextView show_suggest;
 
 private void initViews(){
  button_calc = (Button)findViewById(R.id.submit); 
  num_height = (EditText)findViewById(R.id.height);
  num_weight = (EditText)findViewById(R.id.weight);
  show_result  = (TextView)findViewById(R.id.result);
  show_suggest  = (TextView)findViewById(R.id.suggest);
 }
 
 private void setListener(){
  button_calc.setOnClickListener(calcBMI);
 }

 
 private OnClickListener calcBMI = new OnClickListener(){
  public void onClick(View v){
     
    DecimalFormat nf = new DecimalFormat("0.00");
    double height = Double.parseDouble(num_height.getText().toString())/100;
    double weight = Double.parseDouble(num_weight.getText().toString());
    double BMI = weight/ (height*height);
     
    //Present result
    show_result.setText(getText(R.string.bmi_result)+nf.format(BMI));
       
    //Give advice 
    if(BMI > 25){
      show_suggest.setText(R.string.advice_heavy);
     } else if (BMI < 20){
      show_suggest.setText(R.string.advice_light);
     } else {
      show_suggest.setText(R.string.advice_average);
     }
  }
 };
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
}


第15-16行
@Override
protected void onCreate(Bundle savedInstanceState) {
}
『onCreate』是這個方法的名稱,同時傳入一個Bundle類別的參數savedInstanceState。目前只需要知道savedInstanceState只是處理記憶體相關的事情就可以。因為我們的『MainActivity』類別繼承了Activity類別,所以『MainActivity』也要實作『onCreate』方法。事實『onCreate』方法是每個Activity類別在初始化時都會呼叫的方法。第15行中有『@』開頭的語句,那是裝飾子(decorator)的語句,『@Override』的作用是告訴程式我們要覆載『onCreate』這個方法。這時候當程式執行的時,將不再使用Activity類別裡的『onCreate』方法,而是使用『MainActivity』中自行實作的行為。接下來看看『onCreate』方法中的程式內容。

第17行
super.onCreate(savedInstanceState);
『super』是關鍵字,表示『MainActivity』的父類別(Activity)。程式的意思是呼叫Activity中的『onCreate』方法。Activity類別初始化的時候都會呼叫『onCreate』的方法。原本繼承『Activity』類別的『onCreate』方法,因為『@Override』的原因內容被重寫。因此想要將『Activity』類別的『onCreate』方法保留並加入我們的內容,就要使用『super』語句。

第18行
setContentView(R.layout.activity_main);
要將我們所定義好的畫面顯示在Activity當中要用『setContentView』,而在上一章節所定義好的UI components在activity_main.xml檔案中,只要透過『setContentView』參數設定為『R.layout.activity_main』引用XML文件描述檔就能將UI 顯示在Activity中。

第24-36行
private void initViews(){
  button_calc = (Button)findViewById(R.id.submit); 
     ...
 }
這段程式主要的功用是宣告Android介面上全部的UI components。透過Activity類別中內建的『findViewById』方法,可以根據識別代號從資源檔中取得對應的UI components實體。這邊以『R.id.submit』按鈕元件為例。我們可以在前面加上『Button』來強制將這個UI components 實體轉型為Button類別的實體。

『R.id.submit』對應到XML描述檔的資源。
  <Button android:id="@+id/submit"
  />
第39行
button_calc.setOnClickListener(calcBMI);
這句是包含『Button』類別中『setOnClickListener』方法。方法中傳入一個名叫『calcBMI』的函式。在Android系統的UI互動方式是採用事件驅動方式。也就是當使用者按下『button_calc』按鈕的時候,Android系統會去觸發『setOnClickListener』方法中所指定的函式『calcBMI』。

 private OnClickListener calcBMI = new OnClickListener(){
  public void onClick(View v){
    ....
   }
};
當使用者按下按鈕時,就會觸發『OnClickListener』類型的事件函式。此範例中的所有邏輯運算都放在這函式中。

BMI值運算,BMI的公式是(體重/身高(m)*身高(m))
double height = Double.parseDouble(num_height.getText().toString())/100;
double weight = Double.parseDouble(num_weight.getText().toString());
double BMI = weight/ (height*height);

透過『TextView』類別中的『setText』方法將結果輸出到手機畫面。
show_result.setText(getText(R.string.bmi_result)+nf.format(BMI));

顯示建議
if(BMI > 25){
   show_suggest.setText(R.string.advice_heavy);
} else if (BMI < 20){
   show_suggest.setText(R.string.advice_light);
} else {
   show_suggest.setText(R.string.advice_average);
}