xml에서 레이아웃을 작성할 때 사용하는 그 android:id="@android:id/" 가 지금 설명하려는 것이다.


이 ID는 xml에 정의된 고유 ID 뿐만 아니라 어플리케이션에서 결과 코드값으로도 사용할 수 있다.


선언 방법은 간단하다.


res/values/ids.xml 에서 아래와 같은 형식으로 적어주면 된다.


<?xml version="1.0" encoding="utf-8"?>
<resources>
   
<item type="id" name="button_ok" />
   
<item type="id" name="dialog_exit" />
</resources>

resource는 무조건 root에 있어야 하며, item 태그는 value를 가지지 않고 속성만을 가지고 있다. type은 항상 "id" 이어야하고 name은 ID에 붙이고 싶은 이름을 넣으면 된다.


<Button android:id="@id/button_ok"
   
style="@style/button_style" />


그리고 위와 같이 레이아웃 등에서 사용할 수 있다.


이런 것들은 굳이 ids.xml에 선언하지 않아도 원하는 레이아웃에서 직접 ID를 설정할 수 있다. 그렇다면 왜 굳이 이런 번거로운 방법을 사용하는걸까.


ids.xml에는 모든 ID가 선언되어 있기 때문에 컴파일러는 그것들을 recognize 할 수 있다.


<TextView
    android:id="@+id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignBelow="@id/text2"
    android:text="...."/>
<TextView
    android:id="@+id/text2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="...."/>


text2라는 ID를 가진 뷰가 선언되기 전에 text2를 text1에서 참조하였기 때문에 에러가 발생한다. 이 때 ids.xml에 ID들을 미리 선언해둔다면 이러한 에러를 피해갈 수 있다.


이런 예시도 있다. 대형 프로젝트의 경우, id를 굉장히 많이 선언하게 되는데. 만약 중간에 View 하나를 삭제했다면 컴파일러는 no such field 같은 오류를 뿜을 것이다. 하지만 이런 오류 메시지 하나만으로는 그 많은 소스 코드에서 어떤 것이 문제인지 모를 수도 있다.


하지만 만약 ids.xml에 id들을 선언해놓는다면, 이 에러는 피해갈 수 있을 것이다.(이게 최고의 해결방법인지는 모르겠지만)



어쨌든 지금 분석하고 있는 nRF Toolbox 라는 어플리케이션의 코드에서는 ids.xml이라는 것을 사용한다. 난 그것과 관련된 오류 때문에 이 자료들을 찾아봤고.


...그냥 그렇다고.



참고


More Resource Types - ID(Google Developers)


what is ids.xml used for?

블로그 이미지

NCookie

,