본문 바로가기

Android

layout id 값 live template 으로 처리 하기

원래 반복되는 코드를 매우 귀찮아 하던 차에 layout id 를 class name 을 기반으로 가져오도록 코딩을 해 놓은게 있었는데 (아래 참조)

private var mLayoutName = generateLayoutName()
inline fun Fragment.generateLayoutName(): String {
    val name = javaClass.simpleName
    var layoutName = name[0].toLowerCase().toString()

    name.substring(1, name.length).forEach {
        layoutName += if (it.isUpperCase()) {
            "_${it.toLowerCase()}"
        } else {
            it
        }
    }

    return layoutName
}

그렇게 사용하면 해당 레이아웃 리소스가 사용되는지 안되는지 알 수가 없는 문제가 있다! 라는 의견을 들어
생각해보니 그렇네 싶긴 한데, 이미 편한건 맛을 본 상태라 어떻게 이걸 풀까? 고민 하던 차에
잘 이용하던 live template 으로 이를 해결이 될까? 하고 잠시 짬을 내서 봤더니만 역시나 된다.

일단 기존에 사용 하던 코드를 주석 처리 하고
// @LayoutRes
// open fun layoutId() = resources.getIdentifier(mLayoutName, LAYOUT, packageName)

해당 메소드를 abstract 로 변경 한 뒤
@LayoutRes
abstract fun layoutId(): Int

live template 에 아래와 같이 코드를 추가하였다.
@LayoutRes
override fun layoutId() = R.layout.$layoutName$

이때 $layoutName$ 은 edit variables 버튼을 선택하면 해당 변수에 대해 값을 지정할 수 있는데
기존 방식과 유사하게 파일명을 참조 하도록 아래와 같이 추가 했다.
snakeCase(fileNameWithoutExtension())

이로써 리소스 사용유/무에 대한 이슈는 해결