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 에러를 조심하 코딩을 한다.
이미 많이 해 본 것이므로 잠깐 다루고 지나간다.
- UI
- LinearLayout (LinearLayout 자세히 알아보기)
- TextView 속성
- EditText 속성
- Button
- Kotlin 문법
- when 분기문
- 람다함수 (람다함수 자세히 알아보기)
- Intent (Intent 자세히 알아보기)
BMI 계산 앱
화면 구성
특별한 것은 없고 최상위 ViewGroup 을 LinearLayout 으로 하여 XML 에 선언적 방식으로 여러 View를 구성하였다.
activity_main
<?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>
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