butterknife是大家熟悉的一款view注入框架,这里就不多做介绍。
今天在一个自定义view的地方使用butterknife,设置点击按钮的时候发生的一个异常
代码如下:
public class Title extends RelativeLayout {
@Bind(R.id.tv_title_right)
TextView tvTitleRight;
public Title(Context context, AttributeSet attrs) {
super(context, attrs);
View view = LayoutInflater.from(context).inflate(R.layout.title, this);
}
public void setRightOnClick(OnClickListener click) {
tvTitleRight.setOnClickListener(click);
}
}
布局太简单就不贴出,异常如下:
ava.lang.RuntimeException: Unable to start activity ComponentInfo{com.mrsphoto.mrphoto/com.mrsphoto.mrphoto.activity.LiveActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void'android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at android.app
…………………………………………省略…………………………………………
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
可以看到是在调用setOnClickListener这个方法的时候报了空指针异常,但是setRightOnClick里的tvTitleRight应该已经通过butterknife实例化过了,不应该是空值。于是检查一遍写法,使用Butterknife Zelezny重新生成了一下代码,然后clean。重新运行,还是会出现异常。
于是手动写了一遍findviewbyid:
View view = LayoutInflater.from(context).inflate(R.layout.title, this);
tvTitleRight= (TextView) view.findViewById(R.id.tv_title_right);
然后重新运行,终于正常运行。
看了一下官网的文档http://jakewharton.github.io/butterknife/并没有找到解决方法,如果有解决方法请指出。