Android 程式開發(四)
第15-16行
@Override
第18行
第24-36行
『R.id.submit』對應到XML描述檔的資源。
BMI值運算,BMI的公式是(體重/身高(m)*身高(m))
透過『TextView』類別中的『setText』方法將結果輸出到手機畫面。
顯示建議
在 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); }