Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
426 views
in Technique[技术] by (71.8m points)

android - findViewById returns null on a LinearLayout inside an <include>d view

I cannot figure out mistake here. I may be oevrlooking some thing...

Layout XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <include
        android:id="@+id/headerInclude"
        android:layout_width="fill_parent"
        android:layout_height="38dp"
        android:layout_gravity="top"
        layout="@layout/header" />

    <LinearLayout
        android:id="@+id/actualView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:layout_weight="1" >

        <ListView
            android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:divider="@drawable/dotted_line"
            android:dividerHeight="2dp"
            android:drawSelectorOnTop="false"
            android:paddingBottom="10dp"
            android:paddingTop="10dp" />
    </LinearLayout>

    <include
        android:layout_width="fill_parent"
        android:layout_height="35dp"
        android:layout_gravity="bottom"
        layout="@layout/footer" />

</LinearLayout>

Included header XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/headerLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/header_bgr"
    android:orientation="horizontal"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:paddingTop="7dp" >

    <TextView
        android:id="@+id/tvScreenTitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.8"
        android:ellipsize="end"
        android:gravity="center|left"
        android:singleLine="true"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="#ffffff"
        android:textSize="17sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tvScreenSubTitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.2"
        android:gravity="center|right"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="#ffffff"
        android:textSize="15sp"
        android:textStyle="bold" />

</LinearLayout>

List Activity java code:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    appData = ((DxApp) this.getApplicationContext()).getData();
    setContentView(R.layout.list);
    setTitle("Some Title...");
    // some more code...
    addButtons();
}

protected void addButtons() {
    LinearLayout headerLayout = (LinearLayout) findViewById(R.id.headerLayout);
    Button btn = new Button(this);
    btn.setText("Go to My Sets");
    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            // do some thing here...
        }
    });

    if (headerLayout != null)
        headerLayout.addView(btn);
}

@Override
public void setTitle(CharSequence title) {
    TextView tvTitle = (TextView) findViewById(R.id.tvScreenTitle);
    tvTitle.setText(title);
}

If I remove the check if(headerLayout != null), I get null pointer exception onheaderLayout.addView(btn).
I am able to get TextView in function setTitle but some how cannot get LinearLayout

Can any one help me in figuring out what is wrong with the code...

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

If you set the id attribute for the include element, then that will be the id for the root of the inflated layout. So, instead of looking for a LinearLayout with the id headerLayout look for the id headerInclude(or don't set an id for the include element).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...