Android 리소스 조건

timothy jeong·2021년 11월 2일
0

Android with Kotlin

목록 보기
11/69

리소스 조건은 어떤 리로스를 특정 환경에서만 적용하도록 설정하는 것을 말한다. mdpi(medium dots per inch) 용으로 48x48(px) 이미지를 준비했다고 해보자, 그런데 이 이미지를 똑같이 hdpi(high dots per inch) 에도 적용하면 이미지가 72x72 크기로 나올텐데, 대신 48x48 을 72x72 로 늘린것이기 때문에 이미지의 선명도는 떨어진다.

이러한 일을 막기 위해 여러 이미지를 준비했다면, 각 화면의 크기(환경) 마다 다르게 리소스를 적용하고 싶을 것이다. 이럴때 리소스 조건을 이용한다. 물론 코드상에서도 바꿀 수 있지만, 이를 코드에서 제어하면 코드도 복잡해지고 리소스를 이용하는 원래의 목적에도 부합하지 않다.

그냥 벡터 이미지로 하면 안되나? 벡터 이미지와 앱 아이콘에 대하여 --> 리소스 조건은 단순히 크기에 관한것 그 이상의 것들을 제어하기 때문에 알아둬야한다.

리소스 조건 사용

리소스 조건을 이용하려면 우선 리소스 파일명이 모두 동일해야한다. 그렇게 하면 R 파일에는 식별자가 하나만 생성된다. 그러므로 코드에서는 각 리소스를 구분할 필요없이 R.{name} 으로 지정할 수 있다. 하지만 이렇게 하면 파일명이 중복되면서 오류가 발생하는데, 이는 디렉터리를 나눔으로써 해결된다.

아이콘 이미지라고 한다면 mipmap-mdpi, mipmap-hdpi 처럼 각각의 디렉터리에 담는 것이다. 아이콘 이미지는 프로젝트가 생성되면서부터 여러 디렉터리로 나눠져서 생성되는데, 이렇게 리소스를 배치하는 것만으로도 안드로이드 플랫폼이 알아서 적절한 리소스를 가져다가 사용한다.

이렇게 적용 가능한 리소스 조건은 이 블로그 를 참고하자! 공식문서에서는 어디서 찾는지 모르겠다.

이러한 조건을 어느 리소르 디렉터리에 적용할지는 개발자의 선택에 달려있다. 예를 들어 언어 조건은 values 디렉터리에 적용하여 values-ko-rKR 로, 혹은 drawable 디렉터리에 적용하여 drawable-ko-rKR 로 사용해도 된다.

또한 하나의 디렉터리에 여러 조건을 명시해도 된다. 예를 들어 drawable-ko-rKR-xhdpi 처럼 drawable 디렉터리에 언어 조건과 밀도 조건을 함께 지정할 수 있다. 이때 주의할 점은 조건의 순서를 지켜야 한다는 것이다. 언어 조건 다음에 밀도 조건이 와야한다.

화면 회전에 대응하기

기본적으로 view 들은 디바이스가 세로방향일때와 가로방향일때 모두 대응해서 변화하지만, UX 까지 고려해서 변화하는 것은 아니기때문에 화면이 세로일때, 가로일때 UI 가 달라야 할 수 있다.

이렇게 대응하려면 가로일때, 세로일때 xml 파일을 각각 준비해야 한다. 이를 코드로 구현할 수도 있지만, 리소스 조건을 설정해서 처리하면 더 편리하다.

리소스 조건을 적용하기 위해서는 동일한 이름으로 만들어야 한다고 했다. 하지만 레이아웃 동일한 이름을 만들면 에러가 나온다. 그러므로 new 를 누르고 아래처럼 조건을 정해줘야한다. 그러면 해결된다!

언어 국제화

글로벌 서비스를 제공하려면 리소스 문자열을 각국 언어로 제공해야 한다. 이 부분 역시 리소스 조건 설정으로 처리할 수 있다. strings.xml 파일에 <string> 태그로 문자열 리소스를 작성하는데, 이 파일을 여러 개 만들어서 각 언어에 맞는 리소스 문자열을 담고 어느 xml 파일을 적용해야 하는지를 리소스 디렉터리명으로 지정하면 된다.

역시 디렉터리를 직접 만들면 안되고, new -> values resource file 을 누르고 이름을 strings로 만든뒤 아래 그림처럼 locale 값을 설정하면 된다.

문자열 리소스는 values 디렉터리의 리소스이므로 식별자는 파일명이 아니라 string 태그의 name 값이다. (코드 상에서 R.strings.{name} 으로 식별된다는 것이다. 레이아웃 파일이 R.layout.activity_main 처럼 xml 파일 자체가 참조되는 것과는 다르다.) 따라서 각 파일 내부 string 태그의 name 값이 모두 동일해야한다.

profile
개발자

0개의 댓글