태그 보관물: 안드로이드

사칙연산 게임

개요

오래전부터 숫자를 계산할 때 작은 숫자도 계산기를 이용하게 되었습니다. 그 이전에는 웬만한 계산은 암산으로 해결했는데 이제는 간단한 계산도 어렵다는 생각이 들었습니다. 연습할 수 있는 앱이 없을까 검색해보니 딱 맞는 것이 없었습니다. 객관식 형태로 된 앱이 있었지만 정확한 계산에는 도움이 되지 않을 것 같았습니다. 필자와 같이 기존 앱에 만족하지 못하는 사용자를 위해 사칙연산 게임 앱을 제작하게 되었습니다.

제작

사칙연산을 각각 선택해서 연습할 수 있도록 했습니다. 너무 간단하면 의미가 없어서 각자의 수준에 맞게 숫자 길이와 문제의 개수를 선택할 수 있도록 했습니다. 한자리는 너무 쉬운 것 같아 두자리가 기본값으로 설정되도록 했습니다. 화면모드는 다크모드를 기본으로 했습니다.

사칙연산 게임 설정 화면

원하는 연산을 선택해서 문제를 풀기 시작하면 진행된 시간이 나타나도록 했습니다. 처음에는 각각 정답여부만 출력하려고 했으나 가장 마지막에 출제되었던 문제와 정답을 보여주고 몇개를 맞추었는지 보여주는 방식으로 마무리했습니다. 빼기모드에서는 음수가 나타나지 않도록 조정했고 나누기연산에서는 몫값만 입력하도록 간략화 했습니다.

사칙연산 게임 진행 화면
사칙연산 게임 결과 화면

틈틈히 연습을 해 보니 조금씩 암산 능력이 향상되는 것 같습니다. 물론 꾸준히 연습하고 자리수를 늘려야 하겠지만…

사칙연산 게임 앱으로 암산능력을 향상시켜 보세요! 다음 주소에서 확인하실 수 있습니다.

https://play.google.com/store/apps/details?id=jaeyoung.kim.mathgame

Android view binding 적용

개요

개발 중인 앱에서 kotlin 버전 변경 후 다음과 같은 경고가 나타났습니다.

The ‘kotlin-android-extensions’ Gradle plugin is deprecated. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.android.com/topic/libraries/view-binding) and the ‘kotlin-parcelize’ plugin.

경고 메시지

kotlin-android-extensions gradle 플러그인이 deprecated 되었으니 가이드를 참고해서 마이그레이션하라는 내용입니다. 해당 링크를 확인해 보면 그 방법이 잘 안내되어 있습니다. View binding의 기능과 기존 Activity 에 적용하는 방법을 알아보도록 하겠습니다.

View binding

View binding 에 대한 내용은 이곳에서 확인하실 수 있습니다. 요약하자면 View 와 상호작용하는 코드를 더 쉽게 작성할 수 있게 해 주는 기능입니다. 대부분의 경우 findViewById 를 대치한다고 합니다. 코드내에서 findViewById 를 사용할 필요가 없게 됩니다. findViewById 와는 달리 Null 참조 위험이 없고 Type 도 레이아웃내의 요소와 일치하기 때문에 이전에 발생할 수 있었던 불일치 문제가 없다고 합니다. 레이아웃 XML 과 대응되는 binding class 가 생성되고 그 이름은 레이아웃 파일명에 camel case 가 적용된 후 뒤쪽에 Binding 이 추가된 형태가 됩니다. 예를 들면 다음과 같습니다.

activity_main.xml -> ActivityMainBinding

마이그레이션

먼저 모듈 수준 build.gradle 파일에 다음 내용을 추가합니다.

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

그 다음 앱 수준 build.gradle 파일에서 다음 내용을 삭제합니다.

apply plugin: `kotlin-android-extensions`

Activity 코드에서 다음과 같이 수정합니다.

private lateinit var viewBinding: ActivityMainBinding

super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
val view = viewBinding.root
setContentView(view) //setContentView(R.layout.activity_main) 기존 코드

viewBinding.userName.text = "text" //userName.text = "text" 기존 코드

1행에서 변수를 정의합니다. 4~6 행과 같이 레이아웃 설정 부분을 수정합니다. 8행과 같이 레이아웃에 있는 요소를 참조하면 됩니다. 참고로 기존의 코드도 주석 뒤쪽에 넣었습니다.

이상으로 view binding 을 기존 activity 에 적용하는 방법을 알아보았습니다.