태그 보관물: android

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 에 적용하는 방법을 알아보았습니다.

Android ROOM 초기 자료 입력하기

개요

Android ROOM 을 사용해서 개발할때 앱이 처음 실행될 때 테이블에 자료를 입력해야 할 경우가 있습니다. 기본 설정이나 코드값 같은 형태인데 자료 존재여부를 판단해서 입력할 수도 있습니다. 하지만 DB가 생성될 때 초기 자료를 테이블에 입력하는 것이 필요하지 않는 확인 작업을 줄일 수 있어서 더 효율적입니다.

콜백 함수 등록 및 호출

기본 자료입력은 콜백 함수를 정의하고 호출하는 형태로 구현됩니다. 아래와 같은 형태가 됩니다.

fun getInstance(context: Context): yourDB? {
    if (INSTANCE == null) {
        synchronized(yourDB::class) {
            INSTANCE = Room.databaseBuilder(
                context.applicationContext,
                yourdbDB::class.java, "yourdb.db"
            )
                .fallbackToDestructiveMigration()
                .addCallback(dbCallback)
                .build()
        }
    }
    return INSTANCE
}

var dbCallback: Callback = object : Callback() {
    override fun onCreate(db: SupportSQLiteDatabase) {
        Executors.newSingleThreadScheduledExecutor()
            .execute(Runnable {
                db.execSQL("insert into yourtable (your_field) values (your_value)
            })
    }
}

16-23 행과 같이 콜백 함수를 등록합니다. 생성될 때 execSQL 메소드를 이용해서 필요한 자료를 테이블에 입력하면 됩니다. 그 다음 6행과 같이 addCallback 메소드로 콜백을 추가해서 실행되도록 합니다. 이렇게 하면 처음 DB가 생성될 때 테이블에 자료를 입력할 수 있습니다.