2013-12-16 2 views
8

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

В 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.

Похоже, что в activity_headerview.xml, то RelativeLayout чей идентификатор headerview_header и RelativeLayout чей идентификатор headerview_content не являются дети HeaderView.

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

ответ

15

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

+0

Благодарим вас за помощь, вы экономите мой день. – srain

Смежные вопросы