无法从自定义视图中访问R.id

时间:2010-03-03 23:00:54

标签: android

在我的foo_layout.xml文件中,我有一个子类RelativeLayout:


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <com.android.myapp.FooView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/pegboard_table"
        android:orientation="vertical"
        android:scaleType="fitXY"
        >
        <ImageView   
        android:id="@+id/triangular"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/pegboard_board"
        android:scaleType="fitXY"
    android:gravity="center"
        android:visibility="invisible"
        />
        <Chronometer
        android:id="@+id/timer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/timer_display"
        android:textSize="40sp"
        android:textColor="#000"
        android:layout_alignParentTop="true"
        android:gravity="center"
        android:visibility="invisible"/>
         <TableLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/board_table"
        android:visibility="invisible"
        />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center_horizontal"
        android:background="@drawable/tab_bar">
        <!-- android:layout_alignLeft="@id/options_tab"-->
        <ImageView 
        android:id="@+id/game_select"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/game_select" android:paddingLeft="15sp"/>
        <ImageView 
        android:id="@+id/undo_select"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/game_select"
        android:layout_weight="1"
        android:src="@drawable/undo"
        />
        <ImageView 
        android:id="@+id/settings_select"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/undo_select"
        android:layout_weight="1"
        android:src="@drawable/settings"
        />   
        <ImageView 
        android:id="@+id/info_select"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/settings_select"
        android:layout_weight="1"
        android:src="@drawable/info"
        />
    </LinearLayout>
        </com.android.myapp.FooView>
</FrameLayout>

然后我有一个扩展类的java文件FooView.java RelativeLayout的。


package com.android.myapp;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TableLayout;

public class FooView extends RelativeLayout {

    public FooView(Context context) {
        super(context);
        fillTable();
        // TODO Auto-generated constructor stub
    }

    public FooView(Context context, AttributeSet attrs) {
        super(context, attrs);
        fillTable();
        // TODO Auto-generated constructor stub
    }

    public FooView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        fillTable();
        // TODO Auto-generated constructor stub
    }

    public void fillTable() {
        int board = this.getChildCount();
                View boardView = findViewById(R.id.board_table);
        if (board > 0)
            ;
    }

}

董事会总是0。  boardView始终为null。

这似乎不是正确的行为。我已经尝试了FooView层次结构中的其他视图,findViewById()总是返回null。

对于我的生活,我无法弄清楚我做错了什么。

2 个答案:

答案 0 :(得分:1)

首先,您的小部件正在尝试引用自身之外的小部件。调用findViewById()将为您的小部件提供孩子,而不是布局中其他位置的小部件。

其次,您正尝试从构造函数中执行此操作。那不安全。请等到onFinishInflate()

第三,您可能不希望在其他小部件的R.id值中进行硬连线,但允许通过视图属性或设置器对这些小部件进行配置。要根据配置的ID访问这些小部件,您可以致电findViewById()而不是自己,而是通过getContext()获取的活动。

答案 1 :(得分:0)

在构造函数中使用view.setlayout添加图像视图和计时器视图之前,它们不是自定义视图的一部分。