Android/Kotlin

Kotlin BMI(비만도) 계산기 앱 만들기

dalgorithm 2021. 1. 18. 17:51
728x90

 

✔ 비만도 계산기 기능

- 이름, 몸무게와 키를 입력하는 화면과 비만도 결과를 보여주는 화면으로 액티비티 2개를 구성한다.

- 결과 화면으로 넘어가면 토스트 메세지로 이름과 BMI 수치가 나타난다. 

- 인텐트에 데이터를 담아 다른 화면으로 전달한다.

 

 소스코드

◾ activity_main.xml

- 전체적인 레이아웃을 구성한다.

- ConstraintLayout 기반이다.

- 각 위젯의 아이디를 지정해준다.

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/heightEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        android:ems="10"
        android:hint="키"
        android:inputType="number"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/nameEditText" />

    <EditText
        android:id="@+id/weightEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        android:ems="10"
        android:hint="몸무게"
        android:inputType="number"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/heightEditText" />

    <Button
        android:id="@+id/resultButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:text="결과"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/weightEditText" />

    <EditText
        android:id="@+id/nameEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:hint="이름"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

◾ activity_result.xml

- 결과가 나타나는 화면을 구성한다.

- ConstraintLayout 기반이다.

- 이미지뷰를 넣어 결과에 따라 표정에 변화를 준다.

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".resultActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="130dp"
        android:layout_marginEnd="16dp"
        android:text="결과가 표시되는 곳"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginStart="150dp"
        android:layout_marginTop="60dp"
        android:layout_marginEnd="150dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        app:srcCompat="@drawable/ic_baseline_sentiment_satisfied_alt_24"
        app:tint="@color/teal_700" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

◾ MainActivity.kt

- xml 코드에 대응하는 변수들을 선언한다.

- 다른 액티비티에 값을 전달해주기 위해 savaData, loadData 함수를 생성한다.

- editText 값을 문자열로 변환하고 int형으로 변환해준다.

 

package com.example.bmicalculator1

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText

class MainActivity : AppCompatActivity() {
    lateinit var resultButton: Button
    lateinit var nameEditText: EditText
    lateinit var heightEditText: EditText
    lateinit var weightEditText: EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        nameEditText=findViewById<EditText>(R.id.nameEditText)
        resultButton=findViewById<Button>(R.id.resultButton)
        heightEditText=findViewById<EditText>(R.id.heightEditText)
        weightEditText=findViewById<EditText>(R.id.weightEditText)

        loadData()

        resultButton.setOnClickListener {

            saveDate(
                nameEditText.text.toString(),
                heightEditText.text.toString().toInt(), weightEditText.text.toString().toInt())
            var intent = Intent(this, resultActivity::class.java)
            intent.putExtra("name",nameEditText.text.toString())
            intent.putExtra("height",heightEditText.text.toString())
            intent.putExtra("weight",weightEditText.text.toString())
            startActivity(intent)
        }
    }

    private fun loadData() {
        var pref = this.getPreferences(0)
        var name =pref.getString("KEY_NAME",null)
        var height = pref.getInt("KEY_HEIGHT",0)
        var weight = pref.getInt("KEY_WEIGHT",0)

        if(height !=0&&weight!=0){
            nameEditText.setText(name.toString())
            heightEditText.setText(height.toString())
            weightEditText.setText(weight.toString())
        }
    }

    private fun saveDate(name: String, height: Int, weight: Int) {
        var pref = this.getPreferences(0)
        var editor=pref.edit()

        editor.putString("KEY_NAME",nameEditText.text.toString()).apply()
        editor.putInt("KEY_HEIGHT",heightEditText.text.toString().toInt()).apply()
        editor.putInt("KEY_WEIGHT",weightEditText.text.toString().toInt()).apply()

    }
}

 

◾ resultActivity.kt

- 키와 몸무게에 따라 결과를 다르게 출력한다. 

 

package com.example.bmicalculator1

import android.media.Image
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast

class resultActivity : AppCompatActivity() {

    lateinit var resultTextView: TextView
    lateinit var imageView: ImageView

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

        resultTextView=findViewById<TextView>(R.id.textView)
        imageView=findViewById<ImageView>(R.id.imageView)
        var name=intent.getStringExtra("name")
        var height=intent.getStringExtra("height").toInt()
        var weight=intent.getStringExtra("weight").toInt()

        //BMI계산
        var bmi=weight/Math.pow(height/100.0,2.0)
        when{
            bmi >=35 -> resultTextView.text="고도 비만"
            bmi >=30 -> resultTextView.text="2단계 비만"
            bmi >=25 -> resultTextView.text="1단계 비만"
            bmi >=23 -> resultTextView.text="과체중"
            bmi >=18.5 -> resultTextView.text="정상"
            else->resultTextView.text="저체중"
        }

        when{
            bmi  >=23 ->
                imageView.setImageResource(
                    R.drawable.ic_baseline_sentiment_very_dissatisfied_24
                )
            bmi >18.5 ->
                imageView.setImageResource(
                    R.drawable.ic_baseline_sentiment_satisfied_alt_24
                )
            else ->
                imageView.setImageResource(
                    R.drawable.ic_baseline_mood_bad_24
                )
        }
        Toast.makeText(this,"$name: $bmi", Toast.LENGTH_SHORT).show()
    }
}
728x90