Question

I defined a view, it extends RelativeLayout, I want to extract its children whose id are specified in layout xml file.

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

I defined its attribute in 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>

I use this view in a layout xml file, in 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>

Here the problem comes: in HeaderView.java, line 28, 29, mHeaderContainer and mContentViewContainer are null.

It looks like that in activity_headerview.xml, the RelativeLayout whose id is headerview_header and the RelativeLayout whose id is headerview_content are not the children of HeaderView.

Did I do something wrong? Any help will be great!

Was it helpful?

Solution

When your custom view constructed, the child view has not been attached to your view. try to move your code to onFinishInflate() method. this method will be invoked by the LayoutInflater after all layout has been inflated.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top