Unit 1: Kotlin basics (4)

quokka·2021년 10월 28일
0

Android Basics in Kotlin

목록 보기
4/25

Project: Lemonade app

Google deveopler - Starter Code

👆 이 링크에서 프로젝트의 기본 틀을 클론할 수 있다. 클론 후 주어진 조건에 따라 코드를 완성해보자.

Lemonade 앱 개요

4가지 state가 있다. 처음 앱은 SELECT 상태로 시작된다.

SELECT 상태에서 이미지를 클릭하면, SQUEEZE 화면으로 바뀌고, squeezeCount가 0으로 초기화되고, lemonSize가 2~4 사이 랜덤 숫자로 지정된다.

SQUEEZE 상태에서 이미지를 클릭하면, 클릭할 때 마다. squeezeCount는 +1, lemonSize는 -1이 되어, lemonSize가 0이 되는 순간 DRINK 상태로 전환한다.

DRINK 상태에서 이미지를 클릭하면 RESTART 상태로 전환하고, lemonSize=-1이 된다.

RESTART 상태에서 이미지를 클릭하면 SELECT로 돌아간다.

lemonImage!!.setOnClickListener {
		// TODO: call the method that handles the state when the image is clicked
		clickLemonImage()
}

중앙의 이미지를 클릭할 때마다 setOnClickListener 가 실행된다. 여기서 clickLemonImage() 함수를 호출한다.

private fun clickLemonImage() {
        if(lemonadeState==SELECT){
            lemonadeState=SQUEEZE
            setViewElements()
            lemonSize = lemonTree.pick()
            squeezeCount=0
        }else if(lemonadeState==SQUEEZE){
            squeezeCount++
            lemonSize--
            if(lemonSize==0) {
                lemonadeState = DRINK
                setViewElements()
            }
        }else if(lemonadeState==DRINK){
            lemonadeState=RESTART
            setViewElements()
            lemonSize=-1
        }else if(lemonadeState==RESTART){
            lemonadeState=SELECT
            setViewElements()
        }
}

clickLemonImage() 함수에서는 문제에서 주어진 조건을 작성했다. SELECT만 보면, lemonadeState=SQUEEZE 로 상태를 SQUEEZE로 변경하고, setViewElements()를 호출해 이미지를 변경하고, lemonSizepick() 함수를 호출해 랜덤 수를 지정하고, sqeezeCount를 0으로 초기화한다.

setViewElements()는 다음과 같다.

private fun setViewElements() {
        // TextView 와 ImageView 를 findViewById로 찾기
        val textAction: TextView = findViewById(R.id.text_action)
        val imageAction: ImageView = findViewById(R.id.image_lemon_state)
        val newText = when (lemonadeState) {
            SELECT -> resources.getString(R.string.lemon_select)
            SQUEEZE -> resources.getString(R.string.lemon_squeeze)
            DRINK -> resources.getString(R.string.lemon_drink)
            else -> resources.getString(R.string.lemon_empty_glass)
        }
        // 화면의 텍스트 변경
        textAction.setText(newText)
        // newImageResource에 lemonadeState에 대응하는 이미지 리소스 담기
        val newImageResource = when (lemonadeState) {
            SELECT -> R.drawable.lemon_tree
            SQUEEZE -> R.drawable.lemon_squeeze
            DRINK -> R.drawable.lemon_drink
            else -> R.drawable.lemon_restart
        }
        // 화면의 이미지 변경
        imageAction.setImageResource(newImageResource)
}
val submitText = getResources().getString(R.string.submit_label)

강의에서 string.xml에 있는 resource에 이렇게 액세스 하라는데, 에러가 난다. 🤔

resources.getString(R.string.lemon_select) 대신 이렇게는 된다.

getString(R.string.lemon_select) 단순히 getString만 사용하는 것도 가능한 것 같다.

문자열 리소스 참고


테스트 코드 돌리기

강의에서 기본적으로 제공하는 테스트 코드가 있다.

전체 코드를 run 하면 어플이 우다다다 실행되었다 꺼졌다를 반복하며 테스트가 진행된다.

실행이 완료되면 초록 체크 표시를 확인할 수 있다.

0개의 댓글