Activity Result로 간단한 홀짝 게임을 만들어보자

김흰돌·2022년 12월 14일
0

Activity Result API란?

Activity간 데이터를 주고받기 위해 사용한다.
자세한 건 공식 문서를 참고

만들어볼 게임의 간단한 규칙 설정

A Activity에서 홀, 짝 중 하나를 정한 후 B Activity에 데이터를 넘겨준다.
B Activity에서 랜덤으로 생성 된 홀, 짝과 내가 선택한 값을 비교 후 결과를 다시 A Activity에 넘겨준다.

구성할 액티비티 미리 보기

앱을 실행 후 홀/짝 중 하나를 고른다

버튼을 눌러 다음 액티비티로 넘어가 랜덤으로 생성 된 홀/짝을 확인한다.


SENDRESULT 버튼을 누르면 내가 선택한 값과 랜덤으로 생성된 값을 비교해 결과를 첫 번째 액티비티로 보낸다.

MainActivity

class MainActivity : AppCompatActivity() {

    private lateinit var btn: Button
    private lateinit var input: RadioGroup
    private lateinit var str: String

    private val launcher: ActivityResultLauncher<String> =
        registerForActivityResult(ActivityContract()) { result: String? ->
            result?.let {
                Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn = findViewById(R.id.btn)
        input = findViewById(R.id.input)

        //라디오 버튼 홀, 짝 중 하나를 선택했을 시 홀 혹은 짝으로 값을 초기화 해주는 부분
        input.setOnCheckedChangeListener { _, checkedId ->
            when (checkedId) {
                R.id.odd -> str = "홀"
                R.id.even -> str = "짝"
            }
        }

        btn.setOnClickListener {
            launcher.launch(str)
        }
    }
}

ActivityContract

class ActivityContract : ActivityResultContract<String, String?>() {

    /*
    MainActivity에서 넘어온 값을 Intent로 ResultActivity로 전달
     */
    override fun createIntent(context: Context, input: String): Intent {
        return Intent(context, ResultActivity::class.java).apply {
            putExtra("input", input)
        }
    }

    /*
    ResultActivity에서 넘어온 값을 MainActivity의 launcher로 전달
     */
    override fun parseResult(resultCode: Int, intent: Intent?): String? {
        return when (resultCode) {
            Activity.RESULT_OK -> intent?.getStringExtra("result")
            else -> null
        }
    }
}

ResultActivity

class ResultActivity :AppCompatActivity() {

    lateinit var btn : Button
    lateinit var strResult : TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_result)
        btn = findViewById(R.id.btn)
        strResult = findViewById(R.id.result)

        //랜덤 함수로 숫자 1 혹은 2를 생성 후
        val resultRandom = (1..2).random()

        //1일 경우 홀로, 2일 경우 짝수로 결과값 표시
        strResult.text = when (resultRandom) {
            1 -> "결과는 \'홀\'입니다."
            2 -> "결과는 \'짝\'입니다."
            else -> "오류"
        }

        //매인 액티비티에서 가져온 값을 숫자로 바꿔줌
        val input = when(intent.getStringExtra("input")) {
            "홀" -> 1
            "짝" -> 2
            else -> "오류"
        }

        btn.setOnClickListener {
            //내가 선택한 홀/짝과 결과가 같은지 비교
            if (input == resultRandom) {
                setResult(Activity.RESULT_OK, Intent().apply { putExtra("result", "맞췄습니다!") })
            } else {
                setResult(Activity.RESULT_OK, Intent().apply { putExtra("result", "틀렸습니다!") })
            }
            finish()
        }
    }
}

실행화면


코드

https://github.com/spicypunch/ODD_EVEN.git

0개의 댓글