Android – BMI 계산기 레퍼런스 with. 코틀린

BMI Calculator 에 들어간 클래스/위젯
class, component on the BMI Calculator

  • Intetent for moving Activity
  • Sharedpreference
  • EditText , Button
  • ImageView

It has 2 Activities =>

  • activity_main.xml
  • MainActivity.kt
  • activity_result.xml
  • ResultActivity.kt

I used anko library for convinience.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:inputType="number|textPersonName"
            android:ems="10"
            android:id="@+id/heightEditText"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="16dp"
            android:layout_marginStart="16dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp"
            android:layout_marginRight="16dp" android:hint="@string/height" app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="16dp"/>
    <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:inputType="number|textPersonName"
            android:ems="10"
            android:id="@+id/weightEditText"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="16dp"
            android:layout_marginStart="16dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp"
            android:layout_marginRight="16dp" android:hint="몸무게" android:layout_marginTop="18dp"
            app:layout_constraintTop_toBottomOf="@+id/heightEditText"/>
    <Button
            android:text="결과 "
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/resultButton" android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/weightEditText" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="16dp" android:layout_marginRight="16dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

package com.example.myapplication

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.startActivity
import org.jetbrains.anko.toast

class MainActivity : AppCompatActivity() {

    /* 쉐어드 프리퍼런스 저장 메소드:
       쉐어드 프리퍼런스는 App에 포함되는 데이터 파일을 만들어서 디바이스에 저장하거나 관리하는 객체이다.
       데이터 파일을 편집할 때는 에디터 객체를 불러와야 한다.
        (덕분에 클래스 외부로 데이터를 보내거나, 외부 데이터를 불러올 수 있음)
    */

    private fun saveData(height:String,weight:String){
        val pref = this.getPreferences(0)
        val editor=pref.edit()

        // 키와 밸류를 쌍으로 저장하고 apply한다
        editor.putString("KEY_HEIGHT",height)
            .putString("KEY_WEIGHT",weight)
            .apply()
    }

    // 쉐어드 프리퍼런스 로드 메소드
    private fun loadData(){
        val pref=this.getPreferences(0)
        // 키에 해당되는 밸류를 가져오는데 저장된 값이 없으면 ""을 가져온다
        val height=pref.getString("KEY_HEIGHT","")
        val weight=pref.getString("KEY_WEIGHT","")

        if(!height.equals("") && !height.equals("")){
            heightEditText.setText(height.toString())
            weightEditText.setText(weight.toString())
        }
    }

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

        // 쉐어드 프리퍼런스 이용해서 editText 데이터 세팅
        loadData()

        resultButton.setOnClickListener{
            // editText데이터 불러와서 정수형으로 만들고 저장
            val w:String = weightEditText.text.toString()
            val h:String = heightEditText.text.toString()

            // 값을 가져 왔는데 비어있지 않을 때 if문 성립
            if(!w.equals("") && !h.equals("")){
                // 쉐어드 프리퍼런스 이용해서 영구적으로 데이터 저장
                saveData(h,w)
                // anko라이브러리 사용해서 액티비티 이동 및 인텐트에 데이터 저장 쉽게 해결
                startActivity<ResultActivity>("weight" to w.toInt(), "height" to h.toInt())}
            else
                toast("키와 몸무게를 입력해주세요!")
        }
    }


}

activity_result.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ResultActivity">

    <TextView
            android:text="결과가 표시되는 곳"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/resultTextView" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="16dp"
            android:layout_marginStart="16dp" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:layout_marginTop="130dp"
            app:layout_constraintTop_toTopOf="parent" android:textAppearance="@style/TextAppearance.AppCompat.Large"
            android:layout_marginBottom="57dp" app:layout_constraintBottom_toTopOf="@+id/imageView"/>
    <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp" app:srcCompat="@drawable/ic_sentiment_satisfied_black_24dp"
            android:id="@+id/imageView"
            android:tint="#009688"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>
    <TextView
            android:text="설명이 표시되는 곳"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/description" app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="16dp"
            android:layout_marginStart="16dp" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="16dp" android:layout_marginRight="16dp"
            android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textColor="#009688"
            android:layout_marginTop="68dp" app:layout_constraintTop_toBottomOf="@+id/imageView"/>
</androidx.constraintlayout.widget.ConstraintLayout>

ResultActivity.kt

package com.example.myapplication

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_result.*

class ResultActivity : AppCompatActivity() {

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

        // getStringExtra 메소드를 사용해서 인텐트에 저장된 정수 데이터를 가져 온다.
        val height=intent.getIntExtra("height",0)
        val weight=intent.getIntExtra("weight",0)

        // BMI 계산
        val bmi:Int =(weight/Math.pow(height/100.0, 2.0)).toInt()

        // height기준으로 정상 체중 계산
        val normalw:Int =(22*Math.pow(height/100.0, 2.0)).toInt()

        // 결과 표시
        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_sentiment_very_dissatisfied_black_24dp)
                description.setText("현재 ${bmi}이며 정상 수치까지 -${bmi-22}(-${weight-normalw}kg)입니다.")}
            bmi>=18.5->{
                imageView.setImageResource(R.drawable.ic_sentiment_satisfied_black_24dp)
                description.setText("현재 ${bmi}입니다.")}
            else->{
                imageView.setImageResource(R.drawable.ic_sentiment_dissatisfied_black_24dp)
                description.setText("현재 ${bmi}이며 정상 수치까지 +${22-bmi}(+${normalw-weight}kg)입니다.")}
        }

    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *