[안드로이드] @+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를 주는 것입니다.


제 분석은 이런데 정확한 공식 자료가 있으면 좋겠네요.







작성자

Posted by 드리머즈

관련 글

댓글 영역