Platform/Android

[Colors.xml] Colors.xml 의 리소스를 Kotlin 에서 사용하기

개랭갱깽스타 2022. 3. 1. 12:50

colors.xml 에 있는 리소스를 사용하기 위한 code spinnet

 

fun getColorIntFromResources(context: Context, id: Int): Int? {
    try {
        if (Build.VERSION.SDK_INT>= 23) {
            return context.resources.getColor(id, null)
        } else {
            return context.resources.getColor(id)
        }
    } catch (e: Resources.NotFoundException) {
        Log.e("KHJI", e.message.toString())
        return null
    }
}

 

🙉 해당 code spinnet 에서 try ~ catch 를 사용하는 이유는?

더보기

getColor API

public int getColor(int id, @Nullable Resources.Theme theme) throws Resources.NotFoundException {
    throw new RuntimeException("Stub!");
}

첫번째 parameter 로 전달된 리소스 id 존재하지 않을 때, Resources.NotFoundException 오류를 던집니다.

(해당 오류는 런타임 에러라서, 컴파일 시점에 컴파일 오류가 나지 않습니다.) 해당 오류를 잡기 위해서 try~catch 를 써야합니다! 

 

좀 더 Kotlin 답게 변경한 코드는

⬇️⬇️⬇️

fun getColorIntFromResources(context: Context, id: Int): Int? {
    return try {
        if (Build.VERSION.SDK_INT>= 23) {
            context.resources.getColor(id, null)   //맨 마지막 라인이 반환 값이 된다.
        } else {
            context.resources.getColor(id)        //맨 마지막 라인이 반환 값이 된다.
        }
    } catch (e: Resources.NotFoundException) {
        Log.e("KHJI", e.message.toString())
        null                                     //맨 마지막 라인이 반환 값이 된다.
    }
}

 

반환값으로 try~catch 를 사용할 수 있고, 이 떄, 맨 마지막 라인이 반환값이 된다.

Kotlin 에서는 try~catch 자체도 객체로 취급하는 것 처럼 보인다. 해당 내용이 맞는 지, 좀 더 공부를 해보도록 하겠습니다!

반응형