2013-12-16 27 views
8

Bir görünümü tanımladım, RelativeLayout genişletilmiş, ben onun düzeni xml dosyasında belirtilir onun çocukları ayıklamak istiyorum.FindViewById özel görünümde çocuk görünümü bulmak için

HeaderView.java yılında:

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 } 

ben headview_attrs.xml yılında niteliğini tanımlanmış:

<?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> 

ben activity_headerview.xml yılında, bir düzen xml dosyasında bu görünümü kullanın: Burada

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

sorun geliyor: HeaderView.java, line 28, 29, mHeaderContainer ve mContentViewContainer boştur.

O activity_headerview.xml böyle görünüyor kimin id RelativeLayoutheaderview_header ve kimin id headerview_contentHeaderView çocukları olmayan RelativeLayout olduğunu.

Yanlış bir şey mi yaptım? Herhangi bir yardım çok iyi olacaktır!

cevap

15

Özel görünümünüz oluşturulduğunda, alt görünüm görünümünüze eklenmemiştir. kodunuzu onFinishInflate() yöntemine taşımayı deneyin. Bu yöntem, tüm düzenler şişirildikten sonra LayoutInflater tarafından çağrılır.

+0

Yardımlarınız için teşekkür ederim, günümü kurtarırsınız. – srain

İlgili konular