[안드로이드] @+id 와 @android:id 차이점, 개념
프로그래밍/Android 관련2018. 1. 31. 21:03
안녕하세요. 개발자 드리머즈입니다.
안드로이드 레이아웃 xml 파일에서 만나게 되는 "@android:id", "@+id" 에 대해 정리하려고 합니다.
@+id는 잘 알고 있듯이 자신의 어플리케이션의 resource id를 생성할 때 사용합니다.
예를 들면
1 2 3 4 5 6 | <FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/gonggaWhite" /> | cs |
위와 같은 코드에서 android:id="@+id/frame_container"를 통해 해당 <FrameLayout>을 가리키는 이름을 부여합니다.(R.java에 저장됨)
1 2 3 4 5 6 | public void replaceFragment(Fragment fragment) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.frame_container, fragment); ft.commit(); } | cs |
위 코드에서 4번째 줄만 보면 R.id.frame_container를 통해 <FrameLayout>에 접근하여 조작할 수 있습니다.
그렇다면 "@android:id"는 무엇일까요?
먼저 비슷한 "@android:color"를 보겠습니다.
"@android"는 자신의 앱 내부에 있는 resource가 아닌 Android(framework)에 있는 resource에 접근하기 위해 사용합니다.
예를 들면
1 | android:background="@android:color/transparent" | cs |
위의 코드에서 transparent라는 값은 자신의 apk 내의 resource에서 가져오는 게 아니라 Android(framework)에 있는 resource에서 가져오게 됩니다.
그렇다면 "@android:id"는 어떨까요? 저는 "@android:id"를 아래의 스택오버플로우 글에서 처음 봤습니다.(7번 라인의 코드)
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@android:id/icon" android:layout_width="@dimen/tab_icon_size" android:layout_height="@dimen/tab_icon_size" android:layout_centerInParent="true"/> </RelativeLayout> | cs |
안드로이드에서 탭뷰의 tab을 커스텀하는 방법에 관한 내용입니다. 커스텀하지 않으면 기본적으로 정의된 tab을 사용합니다. 기본 정의된 tab은 <TextView>와 <ImageView>를 포함하고 있습니다. 그래서 아래와 같은 코드로 <TextView>와 <ImageView>를 조작할 수 있습니다.
1 2 3 | tabLayout.addTab(tabLayout.newTab() .setIcon(R.drawable.write75) .setText("쓰기")); | cs |
그런데 custom tab을 사용해버리면 바로 위의 코드처럼 setIcon() 함수와 setText() 함수를 통해 <TextView>와 <ImageView>에 접근할 수 없습니다.
왜냐하면 setIcon() 함수와 setText() 함수가 불리면 안드로이드 프레임워크는 기본 정의된 tab 내의 <TextView>와 <ImageView>를 가리키는 고유 id를 통해 이 들을 조작할텐데 custom tab에서 <TextView>와 <ImageView>를 만들고 "@+id/blahblah"와 같이 이름을 부여해버리면, 안드로이드 프레임워크는 custom tab의 <TextView>와 <ImageView>를 알 수 없기 때문입니다.
그래서 이를 해결하기 위해 custom tab에 만드는 <TextView>나 <ImageView>에 기본 정의된 tab 내의 <TextView>와 <ImageView>와 똑같은 id를 주는 것입니다.
제 분석은 이런데 정확한 공식 자료가 있으면 좋겠네요.
댓글 영역