내 레이아웃 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을 반환합니다.
누구든지 내 문제로 나를 도울 수 있습니까?
답변
에 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);
이 접근 방식을 사용하면 포함 된 모든 필드에 액세스 할 수 있습니다.
답변
<merge>
포함 레이아웃에서 태그를 사용하는 경우 포함 ID가 실제보기가 아닌 병합 태그로 전송 된다는 것을 알았습니다 .
따라서 병합을 제거하거나 일부 레이아웃으로 교체하십시오.
<include>
태그는 실제 볼 수 없습니다, 그래서 findByView 그것을 찾을 수 없습니다. @id 속성 (및 포함 태그에 설정 한 기타 속성)은 대신 포함 된 레이아웃의 루트 태그에 적용됩니다. 따라서 activity.getView (R.id.included1)는 실제로<TextView>
그 자체 여야 합니다.
답변
Romain Guy 는 태그 android:id
안에 속성 을 넣어 포함 된 레이아웃의 ID를 재정의 할 수 있음 을 나타냅니다<include>
.
<include android:id="@+id/cell1" layout="@layout/workspace_screen" />
답변
나는 최고의 답변이 가장 중요한 요점을 놓치고 <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"
/>
답변
예는 이와 같지만 포함 필드에 삽입 된 레이아웃이 사용자 지정 레이아웃이고 해당 루트 레이아웃에 액세스하려는 경우주의하십시오. 이 경우 @ layout / test test의 레이아웃은 실제로 첫 번째 줄에 반환됩니다.
test test1View = (test)findViewById(R.id.test1);
답변
- 태그를 포함 할 때마다 ID를 설정해야합니다.
- 포함 된 하위 요소는 새 ID를 설정합니다. 새 ID를 생성하는 방법을 보려면 https://stackoverflow.com/a/15442898/1136117 항목을보십시오.
답변
문제는 현재 레이아웃 파일에 선언되지 않은 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"/>