iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0

在學習一部分的基礎元件後我們就可以嘗試來寫一個小專案,因此本教學將介紹如何使用 Android Studio 製作 BMI(身體質量指數)計算和判斷 ,當使用者輸入身高和體重後點擊按鈕,如果輸入的是數字且為正,就會跳轉到另一個頁面顯示計算結果及判斷。

由於用BMI判斷是否過重或過輕的結果比較多,這邊就不分辨是否為輕度、中度、重度肥胖,只單純分為過輕:<18.5,適中:18.5~25,過重:>25了

activity_main

首先我們先將需要用到的原件都拉出來,因為這一頁只需要讓使用者可以輸入就行,所以只需要按鈕和兩個EditText分別輸入身高跟體重。

<EditText
    android:id="@+id/main_weight_et"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:hint="輸入體重"/>

<EditText
    android:id="@+id/main_height_et"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:hint="輸入身高"/>

<Button
    android:id="@+id/main_send_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="開始計算"
    android:gravity="center"/>

activity_bmi

這頁是顯示計算結果跟判定的,所以只需要兩個顯示的TextView和一個回到上一頁的Button就好

<TextView
    android:id="@+id/bmi_bmi_tv"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:gravity="center"
    android:text="計算結果"/>

<TextView
    android:id="@+id/bmi_judge_tv"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:gravity="center"
    android:text="判斷結果"/>

<Button
    android:id="@+id/bmi_back_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="再次計算"/>

MainActivity

現在我們可以來宣告並綁定元件了,另外,為了確保使用者只輸入了可計算的數字,我們會利用Pattern來進行正規化,如果輸入有誤便呼叫Toast顯示警告訊息,並運用Intent來傳送使用者輸入的身高體重給BmiActivity

public class MainActivity extends AppCompatActivity {
    private EditText weightEditText, heightEditText; //宣告元件
    private Button sendButton;
    public static final String EXTRA_WEIGHT = "com.example.demo.WEIGHT";
    public static final String EXTRA_HEIGHT = "com.example.demo.HEIGHT";
    // 常數:Intent 傳值時的 key,用來識別資料內容

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

        // 綁定元件
        weightEditText =findViewById(R.id.main_weight_et);//體重
        heightEditText =findViewById(R.id.main_height_et);//身高
        sendButton =findViewById(R.id.main_send_btn);

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 取得使用者輸入的文字(轉字串)
                String heightStr = heightEditText.getText().toString();
                String weightStr = weightEditText.getText().toString();

                // 判斷是否有輸入身高與體重
                if (heightStr.equals("")|| weightStr.equals("")) {
                    Toast.makeText(MainActivity.this, "不可為空值", Toast.LENGTH_SHORT).show();
                    return;
                }else {
                    boolean hisNumber = Pattern.matches("\\d+", heightStr);
                    boolean wisNumber = Pattern.matches("\\d+", weightStr);
                    if (!hisNumber || !wisNumber){
                        Toast.makeText(MainActivity.this, "請輸入純數字且身高和體重必須是正數!!!", Toast.LENGTH_SHORT).show();
                        return;
                    }
                }

                // 建立 Intent,並傳送使用者的輸入資料給 BmiActivity2
                Intent intent = new Intent(MainActivity.this, BmiActivity.class);
                intent.putExtra(EXTRA_WEIGHT, weightStr);
                intent.putExtra(EXTRA_HEIGHT, heightStr);
                startActivity(intent);// 畫面跳轉BmiActivity2
            }
        });

    }

}

BmiActivity

既然有傳送資料,這頁也必須用Intent接收資料計算出結果,再用結果來判定體重範圍,如果對元件有不清楚或是想加深瞭解可以看我之前所寫關於該元件的文章

// 綁定元件
bmiTextView =findViewById(R.id.bmi_bmi_tv);
judgeTextView =findViewById(R.id.bmi_judge_tv);
backButton =findViewById(R.id.bmi_back_btn);

Intent intent = getIntent();//取得從 MainActivity 傳來的 Intent
if (intent != null && intent.hasExtra(MainActivity.EXTRA_WEIGHT) && intent.hasExtra(MainActivity.EXTRA_HEIGHT)) { 
    // 檢查是否成功取得體重與身高資料
    String weightStr = intent.getStringExtra(MainActivity.EXTRA_WEIGHT);
    String heightStr = intent.getStringExtra(MainActivity.EXTRA_HEIGHT);
    // 取得體重與身高的字串值存入變數weightStr和heightStr
    calculateAndDisplayBmi(weightStr, heightStr);
    //呼叫函數calculateAndDisplayBmi計算並顯示Bmi
} else {
    // 如果數據未傳遞,顯示錯誤提醒
    bmiTextView.setText("錯誤");
    judgeTextView.setText("無法獲取計算數據");
    Toast.makeText(this, "無法獲取數據,請返回重試", Toast.LENGTH_LONG).show();
}

接著我們單獨創建一個函數來計算及判斷BMI,然後將計算出來的數據設置成最多兩位小數

private void calculateAndDisplayBmi(String weightStr, String heightStr) { //函數calculateAndDisplayBmi:計算並顯示Bmi
    double w = Double.parseDouble(weightStr); // 體重
    double hCm = Double.parseDouble(heightStr); // 身高 (公分)
    double hM = hCm / 100.0; // /身高轉換為公尺
    double bmi = w / (Math.pow(hM, 2)); // BMI 計算

    String message;
    if (bmi > 25) {
        message = "您過重了,需減肥";
    } else if (bmi < 18.5) {
        message = "您過輕了,需多吃一點";
    } else {
        message = "您的體重適中,請保持";
    }
    judgeTextView.setText(message);//在textView2顯示變數message

    DecimalFormat df = new DecimalFormat("#.##"); // 建立DecimalFormat物件
    String formattedBMI = df.format(bmi);//將bmi格式化成最多兩位小數
    bmiTextView.setText(formattedBMI);

    backButton.setOnClickListener(new View.OnClickListener() {     //Button點擊事件監聽
        @Override
        public void onClick(View view) {
            finish();// 關閉 BmiActivity2,回到MainActivity
        }
    });
}

執行成果展示:

{%youtube A8tF2nZECSM %}


上一篇
Day 16. Checkbox
下一篇
Day 18.TextWatcher
系列文
Android 新手的 30 天進化論:從初學者到小專案開發者21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言