박상권의 삽질블로그

[안드로이드/Android]tools attribute 유용하게 활용하기(xmlns:tools="http://schemas.android.com/tools") 본문

IT/Android-TIP (한글)

[안드로이드/Android]tools attribute 유용하게 활용하기(xmlns:tools="http://schemas.android.com/tools")

박상권 2017.04.01 23:47

안드로이드를 개발하면서 프로젝트를 새로 만들거나 xml파일에서 우리가 자주 만나는 녀석이 있습니다.


xmlns:tools="http://schemas.android.com/tools"






xml에 tools:context="xxx" 라는 걸 수도 없이 보아 왔지만

사실 저는 지금까지 그냥 아무생각없이 지워주거나 무시하고 넘어가곤 했었습니다.

저만 그랬던게 아니라고 말해주세요


그러던 어느날 tools에 대해서 궁금해졌습니다.



tools는 뭐하는 녀석일까요?

알고보면 tools는 그동안 우리가 필요로 했던 기능들을 제공해주는 녀석이었습니다.

유용한 tools의 attribute들을 하나하나씩 소개해드리겠습니다.









tools:text


TextView를 만들고나서 이 TextView에 내용이 어떻게 나오는지 확인을 하고 싶은 경우가 있습니다.

그래서 android:text="어쩌고저쩌고" 처럼 값을 넣어보고 '아 이렇게 나오는구나' 확인을 한뒤 값을 다시 지우곤 합니다.

혹시 이 테스트값을 지우지 않으면 앱에서 실제로 테스트 텍스트값이 나와버려서 곤란한 경우가 있습니다.

이러한 작업은 여간 귀찮은게 아니었지만 다른방법이 없기때문에 항상 이런식으로 TextView가 어떻게 나오는지 테스트를 해왔죠.

하지만 tools:text를 이용한다면 위의 귀찮음이 필요 없습니다.

tools:text에 값을 넣어주면 xml의 layout preview에서 어떻게 나오는지 확인할수 있고 실제 앱에서는 표시되지 않습니다.



위 그림의 경우 preview에서는 오른쪽처럼 모두 값들이 표시되지만 실제 실행할때는 나오지 않습니다.


그외에 tools:src, tools:background등도 위의 기능처럼 똑같이 사용할 수 있습니다.

테스트해본결과 android:xxx 로 실행하는 거의 모든 기능을 tools:xxx 로 대체하면 preview에서는 반영되고 실제로는 나오지 않는 기능인걸 확인 할 수 있습니다

(예) tools:layout_marginTop="16dp" 등










tools:visibility


2개의 View가 겹쳐 있을경우 위의 View때문에 아래의 View가 가려지게 됩니다.

그래서 아래에 있는 View를 꾸밀때 어떻게 나오는지 잘 안보여서 위의 View 코드를 없애거나 android:visibilty="invisible" 로 가려놓고 작업을 하곤 하는데 이것 또한 위의View를 보여지는걸로 코드를 돌려놓지 않으면 의도하지 않은 결과가 나옵니다.

하지만 이또한 tools:visibilty를 이용하면 해결할 수 있습니다.

단순히 preview에서만 안보일뿐 실제 실행할때는 원래대로 View의 구조대로 나오게 됩니다.


<Button
   
android:id="@+id/button"
   
android:layout_width="wrap_content"
   
android:layout_height="wrap_content"
   
android:text="First" />

<Button
   
android:id="@+id/button2"
   
android:layout_width="wrap_content"
   
android:layout_height="wrap_content"
   
android:text="Second"
   
tools:visibility="invisible"  />








tools:listitem


RecyclerView나 ListView를 이용하는경우, 우리는 <RecyclerView> 혹은 <ListView>를 만들고 그에 해당하는 row item 의 xml을 만듭니다.

그럼 아래 스크린샷처럼 해당 RecyclerView/ListView에 해당하는 영역에 Item0, Item1, Item2, Item3 ... 으로 내용이 표시됩니다.


                



tools:listitem을 이용하면 이 영역에 우리가 보여주고자 하는 row item 을 미리 넣어 볼수 있습니다.

<android.support.v7.widget.RecyclerView

android:id="@+id/rc_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingLeft="@dimen/default_padding_small"
android:paddingRight="@dimen/default_padding_small"
tools:listitem="@layout/content_item"
/>




그냥 단순히 텍스트가 있는것보다는 RecyclerView/ListView에 내가 넣으려고하는 row들이 어떻게 보여질지 미리 확인할 수 있기때문에 훨씬 유용합니다.

이 방법은 GridView,ExpandableListView에서도 먹힙니다.

또한 자매품으로 tools:listheader , tools:listfooter도 있습니다.











tools:layout


xml에서 fragment를 사용하는 경우 preview에서는 회색화면으로 fragment의 영역을 보여줍니다.




하지만 여기서 tools:layout으로 fragment에 보여주려는 layout을 지정하면 어떻게 보여지는지 미리 확인할 수 있습니다.















tools:showIn


tools:showIn은 tools:layout의 반대개념이라고 생각하면 됩니다.

row item입장에서도 '내가 이렇게 만들어지면 나를 쓰는애들하고는 어떻게 조화되서 보이지?' 라고 궁금해할 수 있는데요

이때 showIn을 사용합니다.

activity_main.xml에서 textview1.xml을 <include>태그를 이용하여 넣어주는경우가 있다고 가정해보겠습니다.






textview1.xml입장에서도 내가 activity_main에서 쓰일때 어떻게 보여질지 궁금할수 있습니다.

tools:showIn을 사용하면 내가 어떻게 어울려서 보여질지 미리 알 수 있습니다.














tools:locale


Android Studio의 기본언어는 영어입니다.

프랑스어나 스페인어 등 영어가 아닌 언어를 써주면 Android Studio는 우리에게 스펠링이 틀렸다고 안내가 나옵니다.

응안틀렸어




영어의 오타를 잡아주는 이 기능은 유용한경우가 많지만 때로는 영어가 아니어서 잘못 표시되는 경우도 있습니다.

이럴때 tools:locale을 이용해서 이 언어가 영어가 아닌 특정국가의 string임을 알려줄수 있습니다.



이 언어가 프랑스 언어인것을 알려주자 더이상 스펠링이 틀렸다고 알려주지 않습니다.













tools:context


이 포스팅의 영감을 주었던 tools:context입니다.

이 xml이 어떤 액티비티와 연관이 있는지를 알려주는 기능입니다.

tools:context=".MainActivity"라고 만들어 두었다면 이 xml은 MainActivity와 연결되어있구나를 미리 알수있고 이와관련된 작업들에 대해서 작업을 도와줄수 있습니다.



위처럼 onButtonClicked라는 없는 함수이름을 지정해줄경우 새로 onButtonClicked()라는 함수를 만들어주어야 하는데 이 xml이 MainActivity와 연결되어있음을 알기때문에 MainActivity에 함수를 만들건지 도와주는 창을 띄워줄수 있습니다.

만약 context를 지정해주지 않으면 어디서 쓰이는지를 모르기때문에 어떤 추천창도 띄워줄수가 없습니다.














tools:ignore


예를들어 다국적 언어를 지원하는 앱을 만들경우 아래와 같이 string.xml을 만들면 Lint오류가 납니다.


string.xml(en)

<string name="open">Open</string>
<string name="close">Close</string>

string.xml(ko)

<string name="open">열기</string>


'close'에 대한 한글번역값이 없기때문에 MissingTranslation Lint 에러가 발생할것입니다.

Lint오류는 사실 우리에게 매우 유용한 경고입니다.

하지만 가끔은 Lint를 꺼주고 싶은경우가 있습니다.


아래처럼 앱이름은 언어와 상관없이 같은 앱이름으로 쓰고 싶은데 한글용 'app_name'이 없다며 오류를 발생시킬것입니다.

<string name="app_name">DestinationAlarm</string>

이럴때 tools:ignore를 이용해서 MissingTranslation을 잠시 꺼두셔도 좋습니다.

<string name="app_name"  tools:ignore="MissingTranslation">DestinationAlarm</string>

MssingTranslation뿐만 아니라 IconMissingDensityFolder등 무시하고싶은 Lint관련 오류에 대해서 ignore해주실수 있으며 tools:ignore="all" 도 사용하실 수 있습니다.

하지만 특별한 상황이 아닌이상 Lint는 무시하지 말고 꼭 지켜주시는 것이 정신건강에 좋습니다.












tools:targetApi


@TargetApi annotaion과 같은역할을 해줍니다.

만약 GridLayout을 사용하려는경우 API레벨 14이상이어야 사용할수있고 그 아래에서는 사용할 수 없습니다.

minsdkVersion이 14보다 아래일경우 문제가 발생합니다.

그래서 targetapi는 14임을 명시해주어서 14이상에서만 앱이 동작할 수 있도록 유도할 수 있습니다.


<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
   
xmlns:tools="http://schemas.android.com/tools"
   
tools:targetApi="14" >














tools:shrinkMode / tools:keep / tools:discard


이 외에도 shrink와 관련된 tools:keep, tools:shrinkMode, tools:discard등이 있습니다.

shrink는 사용하지않는 코드및 리소스들을 축소시킬때 유용합니다.

자세한 내용은 아래 링크를 통해서 확인하실 수 있습니다.

https://developer.android.com/studio/build/shrink-code.html


shrink를 이용하고 있고 리소스를 축소하고 싶지만 특정 리소스를 유지하거나 없애버리고 싶은경우에 keep과 discard를 이용해주면됩니다. 


<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
   
tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
   
tools:discard="@layout/unused2" />

위와같이 선언해주는 경우 keep한 리소스들은 없어지지 않으며 discard한 리소스들은 없어지게 되는것을 확인할 수 있습니다.







어때요 몰랐던 유용한 tools관련 attribute를 발견하셨나요?

저는 tools:text, tools:layout, tools:listitem을 정말 유용하게 사용하고 있답니다.

여러분들에게도 많은 도움이 되었으면 좋겠습니다.

tools attribute와 함께 행복한 코딩하시기 바랍니다.

감사합니다.








6 Comments
댓글쓰기 폼