안드로이드와 앱/안드로이드

사전캠프 1주차 강의 [BMI계산기]

정혜현 2024. 5. 27. 11:35

 

 

 

 

요약

사전준비 : 안드로이드 스튜디오 설치, 애뮬레이터 생성

xml  : 팔레트로 컴포넌트 생성, 속성 설정, id부여

kotlin : 컴포넌트에 따른 코드 입력, BMI계산기 완성 후 사용

문제해결 및 회고


 

1. 사전준비

 

1.1 개발환경

안드로이드 스튜디오 : 설치 - New project  생성 - 완료(자동으로 빌드)

애뮬레이터 : Device manager - Create device - 가상의 디바이스 생성
애뮬레이터 영어로 설정되어있을 경우, System - Langage - 한국어로 변경
빌드시 버전이 안 맞아 에러가 발생하는 경우, build(module) - compileSdk, targetSdk 변경 

 

 

 


 

 

2. xml

2.1 레이아웃 팔레트로 화면구성하기

textView : 개발자가 지정한 텍스트
editTextNumber : 사용자가 입력하는 텍스트. 숫자만 입력가능
중앙정렬 원할 경우, android : gravitiy="center"
imageView : 구글링(예 : free icon) 원하는 이미지 다운로드 - 이름수정 - res - drawable에 복붙

 

2.2 속성 편집하기

중앙정렬 : top start end 0으로 지정("parent")
체인으로 수평맞추기 : 그룹핑 - horizontal chain - 체인스타일 packed 
size단위 : 대부분 dp, text는 sp
id 부여 : android : id="@+id/아이디입력"
아이디는 왜 입력해야할까? 고유값이 있어야 컴포넌트를 지정해 사용할 수 있다.

 

 


 

 

3. kotlin

3.1 변수와 컴포넌트 연결하기

변수선언 변수이름 = findViewById<컴포넌트종류>(R.id.컴포넌트 아이디입력)

val heihtEditText = findViewById<EditText>(R.id.et_height)



 

3.2 editText에서 사용자가 입력한 값 가져오기

변수선언 변수이름 = Int = 컴포넌트이름.text.toString().toInt()
입력한 값을 가져오려면 toString을 붙여줘야 한다. 정수형을 가져올 경우 toInt까지 붙여줘야 한다.

val height :  Int = heihtEditText.text.toString().toInt()

 

 

 

3.3 MainActivity와 ResultActivity 연결하기

Activity에서 데이터를 넘겨주려면 intent를 쓴다. putExtra("키값", 실제 데이터)함수와 startActivity(intent)까지 입력

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

ResultActivity에서 데이터를 넘겨받으려면 getIntExtra("키값",0)을 똑같은 키로 써줘야 해당 변수에 담긴다.

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

 

 

 

3.4 Toast로 메시지 띄우기

데이터를 넘겨줄 준비는 마쳤는데 아무것도 입력해주지 않는다면 곤란하다. 조건문으로 예외처리를 해줘야 한다.
if(데이터를 입력받을 변수이름.text.isEmpty()){Toast.makeText(this,"메시지",얼마나 오래 띄울 것인지).show() return@setOnClickListener}
isEmpty() 비어있을 경우, Toast.makeText 괄호에 해당하는 메시지를 띄운다. 입력 안했는데 밑에 코드를 실행하면 안되므로 return을 넣는다.

 if(heihtEditText.text.isEmpty()){
 	Toast.makeText(this, "신장을 입력해주세요.", Toast.LENGTH_SHORT).show()
	return@setOnClickListener
}

 

 

 

3.5 계산식 쓰기

BMI = 체중(kg)을 신장(m)의 제곱으로 나눈 값. 신장 단위(cm에서 m)변환, 제곱처리, 소수점 정리를 해야한다.
신장 단위변환은 신장/100, 제곱은 .pow(2얼마를 제곱할 것인지.0)함수, 소수점정리는 round(처리할 함수*10)/10으로 처리한다. 첫째자리는 (*10/)10 둘째자리는 (*100/)100

var value = weight / (height/100.0).pow(2.0)
	value = round(value*10)/10

 

 

 

3.6 계산결과에 따라 표현하기

단계별로 나뉘는 계산결과에 맞춰 문구, 이미지, 글자색을 다르게 표현하고자 변수를 선언한다. 조건식으로도 단계별 문구, 이미지, 글자색을 지정한다. 시작은 if, 끝은 else, 그 사이에는 else if로 복붙하여 효율적으로 만들 수 있다. 

var resultText = ""
var resImage = 0
var resColor = 0

if(value < 18.5) {
	resultText = "저체중"
    resImage = R.drawable.img_lv2
    resColor = Color.YELLOW
} else if(value >= 18.5 && value < 23.0) {
    resultText = "정상체중"
    resImage = R.drawable.img_lv1
    resColor = Color.GREEN
}

 

메인에서 했던 것처럼 결과도 컴포넌트 연결해준 뒤 컴포넌트가 담긴 변수.그 변수에 들어온 텍스트와 계산식 및 계산결과에 따른 표현을 연결해주고 되돌아가는 버튼까지 넣어주면 완성된다. 

tv_resValue.text = value.toString()
tv_resText.text = resultText
iv_image.setImageResource(resImage)
tv_resText.setTextColor(resColor)

btn_back.setOnClickListener{
	finish()
}

 

 

 


 

 

4. 문제해결

 

4.1 문제 : 키와 몸무게를 여러 단계로 입력하고 버튼을 눌러봐도 기본값으로만 결과가 뜨는 상태

에러메시지는 못가져왔다.

 

4.2 해결과정

1. 구글링 : 에러메시지를 구글에 검색 후 스펠링 틀린 부분 찾아 고쳤더니 해결됐다.


 

 

 

 

 

 


회고

첫 앱부터 멋지게 실패!

 

경고메시지는 어떻게 보는지도 몰랐고 구글링을 하기 전에 직접 해결하는 게 좋을 것 같다고 생각했던 나는 어느 부분에서 문제가 발생한건지 혼자 온 코드를 뒤적였다. 무면허 탐정은 물증없이 심증으로만 용의자를 줄세워 진지하게 수사하고 있었다. 계산식이 틀렸는지 제거한 뒤 실행해봐도 안되고, Activity끼리 intent로 값을 넘겨받지 못하는건가 싶다가 그러기엔 화면은 넘어가니 아닌 것 같고, import되지 않은 부분은 없는지 찾아보고, id가 잘못 적혀있는 건 아닌지 확인해보고, closing되지 않은 코드가 없는지 검토해도 답을 못찾은지 3시간 째...

포기하고 경고메시지를 그대로 구글에 검색해보니 어떤 문제인지에 대한 설명, 어디에서 문제가 나타난 것인지 보는 방법까지 친절히 가르쳐줬다. 뭐든 남의 도움을 받기 전에 스스로의 힘으로 해봐야 된다고 생각했는데 프로그래밍에서는 시간낭비하지 말고 효율적으로 문제를 해결하는 게 더 옳다고 느꼈다. 검색실력 증진이 문제해결능력을 기르는 방법 중 하나이기도 하고. 스펠링 빼먹은 setOnClickListener...발견... 고작'e' 하나 때문에 이 난리였다.
  e젠 구글링 퍼스트.