Android/TOYTOY

Intent, LinearLayout, 람다함수를 사용한 BMI 계산 앱

sh1mj1 2022. 8. 29. 23:56

앞으로 공부한 것들을 바탕으로 아주 간단한 앱들을 포스팅할 계획이다. 사실 토이 프로젝트라고 하기도 민망한 수준이기 때문에 TOYTOY 프로젝트라고... .ㅎ

 

이 포스팅은 https://fastcampus.co.kr/dev_online_iosappfinal 을 참고하여 만들어졌습니다.

 

이전에 배운 LinearLayout 와 Intent, 람다함수를 사용한 아주 간단한 앱이다.

사용자로부터 신장과 체중을 받아서 사용자의 체중이 비만인지, 정상 체중인지, 저체중인지를 알려준다.

findViewById 을 통해 UI 컴포넌트를 가져왔으며 Intent 을 통해 액티비티 간 전환, 데이터 전달을 다룬다.

또 null 에러를 조심하 코딩을 한다.

이미 많이 해 본 것이므로 잠깐 다루고 지나간다.

BMI 계산 앱

화면 구성

특별한 것은 없고 최상위 ViewGroup 을 LinearLayout 으로 하여 XML 에 선언적 방식으로 여러 View를 구성하였다.

activity_main

사용자가 신장과 체중을 입력하는 Activity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:text="@string/height"
        android:textColor="#111111"
        android:textSize="19sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/height_Et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="10dp"
        android:layout_marginTop="20dp"
        android:autofillHints="write your height"
        android:inputType="number"
        tools:ignore="LabelFor" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:text="@string/weight"
        android:textColor="@color/black"
        android:textSize="19sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/weight_Et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="10dp"
        android:layout_marginTop="20dp"
        android:autofillHints="write your height"
        android:inputType="number"
        tools:ignore="LabelFor" />

    <Button
        android:id="@+id/check_Btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginHorizontal="20dp"
        android:layout_marginTop="50dp"
        android:text="@string/Check" />

</LinearLayout>

사용자가 신장, 체중으로 계산한 BMI 수치, 결과 보는 Activity

activity_result

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".ResultActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="BMI : "
            android:textSize="20sp"
            />

        <TextView
            android:id="@+id/bmi_result_num_Tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/red"
            android:textSize="20sp"
            tools:text="23.1111"
            android:textStyle="bold"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="결과는 "
            android:textStyle="bold"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/bmi_result_str_Tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/red"
            android:textSize="20sp"
            tools:text="과체중"
            android:textStyle="bold"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="입니다."
            android:textSize="20sp" />
    </LinearLayout>

</LinearLayout>

 

CODE

MainActivity

package com.example.bmi_cal_01

import ...

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val heightEt: EditText = findViewById(R.id.height_Et)
        val weightEt = findViewById<EditText>(R.id.weight_Et) 
                // Type을 변수 뒤에 적거나 혹은 findViewById 뒤 <> 에 넣어야 한다.
        val resultBtn = findViewById<Button>(R.id.check_Btn)

//        resultBtn.setOnClickListener() // 이건 인터페이스를 만들어주어야 한다.

        resultBtn.setOnClickListener {
            if (heightEt.text.isEmpty() || weightEt.text.isEmpty()){
                Toast.makeText(this, "빈 값이 있습니다.", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            val height: Int = heightEt.text.toString().toInt()
            val weight: Int = weightEt.text.toString().toInt()
            Log.d("MainActivity", "ResultBtn Clicked, height: $height, weight: $weight")

            val intent = Intent(this, ResultActivity::class.java)
            intent.putExtra("height", height)
            intent.putExtra("weight", weight)
            startActivity(intent)

        }

    }

}

 

 

ResultActivity

package com.example.bmi_cal_01

import ...

class ResultActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_result)

        val height = intent.getIntExtra("height", 0)
        val weight = intent.getIntExtra("weight", 0)

        Log.d("ResultActivity", "height: $height, weight: $weight")
        val bmi = weight / (height / 100.0).pow(2.0)  // double 로 치환을 해주어야 함. 기본적으로 Int 형을 Float 나 double 로 나누면 자동으로 실수형으로 치환이 된다.
        val resultText = when {
            bmi >= 35.0 -> "고도 비만"
            bmi >= 30.0 -> "중정도 비만"
            bmi >= 25.0 -> "경도 비만"
            bmi >= 23.0 -> "과체중"
            bmi >= 18.5 -> "정상체중"
            else -> "저체중"
        }
        val resultNumTv = findViewById<TextView>(R.id.bmi_result_num_Tv)
        val resultStrTv = findViewById<TextView>(R.id.bmi_result_str_Tv)

        resultNumTv.text = bmi.toString()
        resultStrTv.text = resultText
    }

}

https://github.com/sh1mj1/Bmi_ch01

 

GitHub - sh1mj1/Bmi_ch01: Bmi calculator

Bmi calculator. Contribute to sh1mj1/Bmi_ch01 development by creating an account on GitHub.

github.com