Android Tools Namespace
Android Studio는 디자인 타임 기능 (Design-time features)
또는 컴파일 타임 동작 (compile-time behaviors)을 가능하게 하는
다양한 XML 속성을 tools namespace에서 지원합니다.
디자인 타임 기능 : 디자인 모드에서 구성 요소와 컨트롤의 동작 및 표시하는 기능.
ex) fragment에서 표시할 레이아웃
컴파일 타임 동작 : 컴파일러에 의해 수행되는 동작.
ex) XML 리소스에 축소 모드를 적용하는 것
이러한 속성을 이용하려면 아래와 같이 tools namespace를 XML 파일의 root 요소에 추가해야 합니다.
Tools 속성들에 대해서 알아보겠습니다.
Lint 경고 메시지와 관련된 속성입니다.
특정 요소에 대한 Lint 검사를 비활성화할 수 있습니다.
CardView에서 UnusedResources Lint 검사를 비활성화할 수 있습니다.
CardView에 선언하면 하위 요소인 ImageView, TextView 모두에도 UnusedResources Lint 검사가 비활성화됩니다.
tools:ignore="UnusedResources"
쉼표(,)를 이용해서 여러 개의 Lint 검사를 비활성화할 수 있습니다.
tools:ignore="NewApi, StringFormatInvalid"
모든 Lint 검사를 비활성화할 수도 있습니다.
tools:ignore="all"
Java 코드의 @TargetApi 주석과 동일하게 작동합니다. 이 요소를 지원하는 API 레벨 (정수 또는 코드 이름)을 지정할 수 있습니다.
예를 들어, GridLayout은 API 레벨 14 이상에서만 이용할 수 있기 때문에 targetApi를 14로 지정해야 합니다.
Lint 맞춤법 검사기의 경고 메시지를 방지 위해 resources에 대한 기본 언어/로케일을 지정할 수 있습니다.
예를 들어, "¡Hola!"는 "안녕하세요"라는 의미를 가진 에스파냐어입니다.
이를 resources에 추가하면, 안드로이드의 기본 resource는 영어이기 때문에 아래와 같이 맞춤법 검사기의 경고 메시지가 나타납니다.
이를 방지하기 위해 아래와 같이 locale을 에스파냐어인 "es"로 등록하면 됩니다.
Android Studio 레이아웃 미리보기에서만 볼 수 있는 레이아웃 특성을 정의하는 속성입니다.
레이아웃 미리보기에 샘플 데이터를 삽입할 수 있습니다.
<View> 속성의 "android:" namespace 대신 "tools:" namespace로 변경만 하면 됩니다.
이 기능을 이용하면 런타임에서 속성 값을 채우지 않아도 레이아웃 미리보기에서 먼저 그 결과를 확인할 수 있습니다.
예를 들어, "android:text" 대신 "tools:text"를 이용하면 레이아웃 미리 보기에서 값이 적용된 View를 볼 수 있습니다.
tool 속성은 앱을 빌드될 때 제거되므로 APK 크기 또는 런타임 동작에 전혀 영향을 미치지 않습니다.
만약 "android:text"와 "tools:text"를 동시에 쓰면, 미리보기에서는 "tools:text" 값이 적용되어 보입니다.
해당 레이아웃과 연동된 Activity를 선언합니다.
이를 통해 Activity에 대한 정보가 필요한 editor 또는 레이아웃 미리보기의 기능을 사용할 수 있습니다.
예를 들어, 아래와 같이 ImageView에 onClick이라는 이벤트를 XML 속성에 등록하면 quickfix 기능이 기본적으로 MainActivity로 연동되어 있습니다.
fragment를 레이아웃 미리보기에서 볼 수 있습니다.
일반적으로 fragment는 XML에 정의해도 미리보기에서 보이지 않습니다.
tools:layout 속성을 이용하면 해당 fragment를 미리보기에서 볼 수 있습니다.
리스트의 item, header, footer를 미리 보여 줄 수 있습니다.
해당 레이아웃이 상위 레이아웃에 포함된 상태로 미리보기 할 수 있습니다.
왼쪽과 같이 fragment XML 미리보기를 하면 fragment만 볼 수 있는데, 이 속성을 이용하면 오른쪽처럼 activity에 포함된 상태로 미리 볼 수 있습니다.
다음 속성을 사용하면 엄격한 참조 확인을 활성화하고 리소스 축소를 사용할 때 특정 리소스를 유지할지 또는 폐기할지 여부를 선언할 수 있습니다.
쉽게 말해서 안 쓰는 리소스를 알아서 제거해줍니다.
여기서 말하는 리소스는 values/ 폴더에 정의된 리소스들(문자열, 치수, 스타일 및 색상 등)을 제외한 리소스입니다.
이 속성을 이용하면 리소스 축소 모드(shrinkMode)를 지정할 수 있습니다.
엄격 모드(strict mode) : 코드나 다른 리소스에 명시 적으로 참조된 리소스만 유지
안전 모드(safe mode) : 엄격 모드 + 코드가 Resources.getIdentifier()를 호출하여 동적으로 참조될 수 있는 모든 리소스를 유지
기본값은 안전 모드(shrinkMode = "safe")이기 때문에 엄격 모드를 이용하려면 다음과 같이 <resources> 태그에 shrinkMode = "strict"를 추가해야 합니다.
이 파일을 프로젝트 리소스에 저장합니다(예: res/raw/keep.xml에 저장).
빌드는 이 파일을 APK에 패키징 하지 않습니다.
리소스 축소를 이용할 때 삭제하지 않고 유지할 리소스를 지정할 수 있습니다.
리소스 축소를 이용할 때 수동으로 삭제할 리소스를 지정할 수 있습니다.
Tools 속성이 뭔지 잘 몰랐는데 디자인 타임 기능을 활용하면 개발하기 많이 편해질 거 같습니다.
앱을 빌드할 때 Tools 속성은 자동으로 제거되므로 APK 크기 또는 런타임 동작에 영향을 미치지 않습니다.
앞으로 많이 씁시다.