FindViewById в пользовательском представлении, чтобы найти дочерний вид

Я определил представление, он расширяет RelativeLayout , я хочу извлечь его дочерние элементы, идентификатор которых указан в XML-файле макета.

В HeaderView.java :

  1 package com.example.test; 2 3 public class HeaderView extends RelativeLayout { 4 5 public HeaderView(Context context, AttributeSet attrs) { 6 this(context, attrs, 0); 7 8 TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.HeaderView, 0, 0); 9 10 int headerId = 0; 11 int containerId = 0; 12 13 // find attributes 14 if (arr != null) { 15 if (arr.hasValue(R.styleable.HeaderView_headerview_header)) { 16 headerId = arr.getResourceId(R.styleable.HeaderView_headerview_header, 0); 17 } 18 if (arr.hasValue(R.styleable.HeaderView_headerview_container)) { 19 containerId = arr.getResourceId(R.styleable.HeaderView_headerview_container, 0); 20 } 21 arr.recycle(); 22 } 23 24 Log.d("test", String.format("headerId: %s, containerId %s", headerId, containerId)); 25 // headerId: 2131296260, containerId 2131296259 26 27 // here: mHeaderContainer is null 28 mHeaderContainer = (RelativeLayout) findViewById(headerId); 29 mContentViewContainer = (RelativeLayout) findViewById(containerId); 30 } 31 } 

Я определил его атрибут в headview_attrs.xml :

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="HeaderView"> <attr name="headerview_header" format="reference" /> <attr name="headerview_container" format="reference" /> </declare-styleable> </resources> 

Я использую это представление в XML-файле макета в файле activity_headerview.xml :

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:test="http://schemas.android.com/apk/res/com.example.test" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.test.HeaderView android:layout_width="match_parent" android:layout_height="match_parent" test:headerview_container="@+id/headerview_content" test:headerview_header="@+id/headerview_header" > <RelativeLayout android:id="@+id/headerview_header" android:layout_width="match_parent" android:layout_height="30dp" > </RelativeLayout> <RelativeLayout android:id="@+id/headerview_content" android:layout_width="match_parent" android:layout_height="match_parent" > </RelativeLayout> </com.example.test.HeaderView> </RelativeLayout> 

Здесь возникает проблема: в HeaderView.java, line 28, 29, mHeaderContainer и mContentViewContainer имеют значение null.

Он выглядит так, как в headerview_header activity_headerview.xml , RelativeLayout чей id – headerview_header и RelativeLayout чей id – headerview_content , не являются HeaderView элементами HeaderView .

Я сделал что-то не так? Любая помощь будет замечательной!

Когда ваш пользовательский вид создан, дочернее представление не привязано к вашему представлению. Попробуйте переместить код в метод onFinishInflate () . Этот метод будет вызываться LayoutInflater после того, как все макет был завышен.

Intereting Posts
Использование методов пользовательских запросов с Android Как сделать кнопочный щелчок и просмотреть элемент списка нажмите в настройке просмотра списка в android Предупреждение: игнорирование атрибута InnerClasses для анонимного внутреннего класса (org.ksoap2.transport.KeepAliveHttpsTransportSE $ 1) JSON Parsing for Android – вложенные элементы? Приложение начинает поиск GPS прямо при запуске приложения, а не при необходимости. Использование «adjustPan» или «adjustResize», характерное для фрагмента Какова единица системы координат холста? – Андроид Android _ Не удалось разрешить импорт android.support.v7.graphics? Изменение цвета фона клавиатуры Где список доступных намерений в Android? Как получить размер дисплея в дюймах на Android? Если Asynctask не выполняет длинную фоновую обработку, то какой метод я должен использовать Пользовательский PopupWindow с устаревшим методом BitmapDrawable SearchView в ActionBar – проблемы с кнопкой * Up * Кнопка Google Hangouts на веб-странице – пригласите параметры, не работающие