当我使用findViewById时,将R.id. [value]中的int作为类构造函数参数传递给NPE

时间:2013-08-27 19:48:40

标签: java android constructor nullpointerexception r.java-file

当我只是尝试创建一个按钮处理类来实现每个按钮的onTouch和onClick事件时,我遇到了一个问题。以下组合有效(ButtonClick是我的类):

/*Constructor*/
public ButtonClick(View v, int clickType){
    if(clickType == 0){
        v.setOnClickListener(this);
    }
    else{
        v.setOnTouchListener(this);
    }
}

/*Call from Main.java*/
ButtonClick button = new ButtonClick(findViewById(R.id.button, 1);

但是,以下给我一个NPE

/*Constructor*/
public ButtonClick(int buttonId, int clickType){
    if(clickType == 0){
        findViewById(buttonId).setOnClickListener(this);
    }
    else{
        findViewById(buttonId).setOnTouchListener(this);
    }
}

/*Call from Main.java*/
ButtonClick button = new ButtonClick(R.id.button, 1);

为什么不将R配置文件中的整数值作为参数传递而不返回NPE,至少在这种情况下?

1 个答案:

答案 0 :(得分:0)

问题是没有id ,但是 findViewById()
在调用此方法之前,'layout'应该'膨胀'。即,将布局XML文件实例化为其对应的View对象。在活动内部,通常setContentView()完成这项工作。否则我们可以将LayoutInflater用于相同的目的。
重要的是,我们获得的inflater实例与当前上下文相关联。因此,在另一个上下文中,我们得到null视图。