레이아웃 XML 파일에 포함을 사용할 때 ID를 지정하는 방법


117

내 레이아웃 xml 파일에 다른 레이아웃 xml 파일 (각각 다른 Android ID가 있음)을 포함했습니다.

<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>

내가 에뮬레이터에서 실행하고, 계층 구조 뷰어, 레이아웃 여전히 쇼 'NO_ID'의 각을 시작하고, 내 코드에 때, 나는이 findViewById(R.id.test1)findViewById(R.id.test2)모두 NULL을 반환합니다.

누구든지 내 문제로 나를 도울 수 있습니까?


6
ID에 @기호 가 없습니다 .
AutonomousApps

답변:


288

에 ID를 지정하십시오. <include>

<include layout="@layout/test" android:id="@+id/test1" />

그런 다음 2 개 findViewById를 사용 하여 레이아웃의 필드에 액세스합니다.

View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);

이 접근 방식을 사용하면 포함 된 모든 필드에 액세스 할 수 있습니다.


18
이 메서드는 test1View 개체에 대해 null 값을 반환합니다.
Nirav Shah

4
차이점을 잘 모르겠습니다. 설명해 주시겠습니까?
Goddchen

30
우리가 포함시킨 레이아웃이 병합을 사용하는 경우 도움이되지 않는다는 것을 알았습니다. 그러나 병합을 사용하지 않는 경우 작동합니다.
Zlatko 2013

@Zlatko 예, 그리고 이것은 merge이론적 으로 도 작동 merge하지 않습니다. 그래서 괜찮습니다.
표시 이름

1
병합이 사용되지 않는 경우에만 작동합니다. 병합의 경우 여기에 지정된대로 불가능합니다. code.google.com/p/android/issues/detail?id=36918#c3
Zahid Rasheed

61

<merge>포함 레이아웃에서 태그를 사용하는 경우 포함 ID가 실제보기가 아닌 병합 태그로 전송 된다는 것을 알았습니다 .

따라서 병합을 제거하거나 일부 레이아웃으로 교체하십시오.

Tor Norbye 다음과 같이 썼습니다 .

<include>태그는 실제 볼 수 없습니다, 그래서 findByView 그것을 찾을 수 없습니다. @id 속성 (및 포함 태그에 설정 한 기타 속성)은 대신 ​​포함 된 레이아웃의 루트 태그에 적용됩니다. 따라서 activity.getView (R.id.included1)는 실제로 <TextView>그 자체 여야 합니다.


3
잘 했어. 병합 태그를 제거하고 작동하기 시작하지만 포함 레이아웃이 없으면 병합 태그의 사용법은 무엇입니까?
Ankur Chaudhary 2015 년

35

Romain Guy 태그 android:id안에 속성 을 넣어 포함 된 레이아웃의 ID를 재정의 할 수 있음나타냅니다<include> .

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />

1
맞습니다. 포함 된 레이아웃 파일에서 루트 요소를 참조하는 방법은 'include'태그에 지정된 ID를 사용하는 것입니다 (제공되지 않는 경우).
Tom R

1
<include>의 ID = 포함 된 레이아웃의 루트 ID
Fadils

ID를 먼저 설정하면 (포함 태그에서 포함 된 레이아웃의 ID를 재정의합니다. 맞나요?) 처음에는 포함 태그를 '@ + id / cell1'로 설정 한 다음 레이아웃 = '으로 설정하면 나타납니다. @ layout / workspace_screen '은 포함 된 레이아웃의 ID로 android : id를 다시 재정의합니다. @Ron Romero의 답변이 더 의미가 있습니다.
Neon Warge

14

나는 최고의 답변이 가장 중요한 요점을 놓치고 <include/>태그가 포함 내용을 보유하는 View를 생성한다고 오해하게 할 수 있다고 생각합니다 .

요점은 include의 id 가 include의 레이아웃 파일의 루트 뷰로 전달 된다는 것입니다.

의미 :

// activity_main.xml
<include layout="@layout/somelayout" android:id="@+id/someid"/>

// somelayout.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

이렇게됩니다 :

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

4

예는 이와 같지만 포함 필드에 삽입 된 레이아웃이 사용자 지정 레이아웃이고 해당 루트 레이아웃에 액세스하려는 경우주의하십시오. 이 경우 @ layout / test test의 레이아웃은 실제로 첫 번째 줄에 반환됩니다.

test test1View = (test)findViewById(R.id.test1);


2

문제는 현재 레이아웃 파일에 선언되지 않은 id를 사용하려고한다는 것입니다. 다시 선언하는 대신를 사용하여 단순히 id를 참조 할 수 있습니다 @+id/. Android Studio를 통해 원래 ID 이름을 리팩터링하면 포함 된 레이아웃에서도 리팩터링됩니다.

<include layout="@layout/toolbar"/>

<TextView
    android:id="@+id/txt_description"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    **android:layout_below="@+id/toolbar"**
    android:layout_marginTop="16dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>

2

사용하는 경우 inflated view의 인스턴스를 사용하여 <RecyclerView>ID 를 찾으십시오 . <include>그렇지 않으면 null 을 반환 합니다.

public class ViewHolder extends RecyclerView.ViewHolder {

        private mTextView;

        public ViewHolder(View view) {
            super(view);
            View include_1 = view.findViewById(R.id.include_1);
            mTextView = (TextView) include_1.findViewById(R.id.text_id);
        }
    }

1

포함 된 레이아웃의 루트 태그에 id를 설정 한 경우 해당 ID를 사용하거나 포함 된 레이아웃에 id를 설정할 수 있습니다.

그러나 id를 둘 다 설정할 수는 없으며 예외가 발생할 수 있습니다.

<include layout="@layout/view_contact_name" android:id="+id/test1"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

또는

<include layout="@layout/view_contact_name"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:id="@+id/llBottomMainView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

0

포함에 대해 이야기 할 때 포함 된 레이아웃 파일 내부의 루트 뷰 또는 포함 라인 자체에 ID가 있고 둘 다에는 없습니다. 예를 들면 :

<include layout="@layout/layout1" android:id="@+id/layout1"/>

레이아웃 1 파일

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout2">

</RelativeLayout>

위의 예는 기술적으로 동일한 레이아웃에 대해 두 개의 ID를 선언했기 때문에 잘못되었습니다. 그래서 당신이해야 할 일은 어떤 요소가 id를 가질 것인지 선택하는 것입니다.


0

와,이 질문에 아직 정답이 없다고 믿을 수 없습니다. 간단한 태그가 짜증납니다. 당신은 시작 것들을 바꿀 수 android:layout_있는 android:id일치하지 않습니다. 그래서 대답은 할 수 없다는 것입니다. 죄송합니다. 대신 할 수있는 것은 내부에 포함 된 뷰를 확장 할 ViewGroup이 될 클래스를 생성 한 다음 레이아웃에 태그로 추가하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.