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);
}
沒有留言:
張貼留言