刚学android,遇到一个问题不知道怎么解决,编译没错,运行出错了,请看图
3个回答
2013-08-21
展开全部
缺少 DrawView 的构造函数。
在DrawView类里添加
public DrawView(Context context, AttributeSet attrs ) {
super(context,attrs);
}
public DrawView(Context context, AttributeSet attrs , int defStyle) {
super(context,attrs);
}
就不会出这个错误了。
追问
请问我写的一个参数的构造器为什么不对,一定要写
public DrawView(Context context, AttributeSet attrs ) {
super(context,attrs);
}才行,
,而且你这个有必要写三个参数的构造器吗?,我经常用ALt加/来提示下面该怎么做,但是这个完全没有提示,新手问题多,还请你多教我。
展开全部
看你的log日志 ,是因为装载xml文件出错的,你看下main.xml中引用的DrawView路径多不对,引用的时候应该是 "DrawView所在的包名.DrawView" 这样引用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的DrawView是通过layout下的xml来声明出来的,所以会提示这个错误。
如果是在xml中声明自定义View,那么自定义View就必须覆写
public DrawView(Context context, AttributeSet attrs ) {
super(context,attrs);
}
构造方法。
所以解决办法有两种:
1) 加入上面的构造方法。
2) 把DrawView自己创建。
例如:
draw = new DrawView(this);
setContentView(draw);
后面继续写你的其他代码,而不需要findViewById取得draw对象
如果是在xml中声明自定义View,那么自定义View就必须覆写
public DrawView(Context context, AttributeSet attrs ) {
super(context,attrs);
}
构造方法。
所以解决办法有两种:
1) 加入上面的构造方法。
2) 把DrawView自己创建。
例如:
draw = new DrawView(this);
setContentView(draw);
后面继续写你的其他代码,而不需要findViewById取得draw对象
追问
现在刚学android,还是尽量先从布局添加组件做起,我已经通过重写构造方法修改了这个程序,但是我不明白为什么这个构造方法要这样写,那我以后再自己定义组件,是不是还是这样写?里面的参数应该是几个?就像二楼他给出的构造方法有三个参数的。。而且我现在刚学,经常通过Alt加/来提示,但是这个却没有提示。。。。新手上路,问题较多,甚至有点幼稚,,还请你多教我。
追答
View类有三个构造方法,你在继承时,至少要覆写其中一个,以便创建你的自定义View。
这三个构造方法分别是一个参数,两个参数和三个参数的。
一个参数的:在自己new对象建立此View时调用,也就是上面的new DrawView(this)这种。
二个参数的:在xml中声明自定义View时调用,就是在main.xml里声明了这种
三个参数的:也是在XML中声明自定义View时调用,但与两个参数的区别是这个加入了Style样式的引用,也就是说,如果你的 main.xml里中加入了style="@style/xxx.xml",就会调用这个三参的方法。
综合以上所说的,如果三个构造方法都覆写,那么你的自定义View怎么建立都行。
如果只想通过java程序代码建立,那么只需要覆写一个参数的。
如果只想通过XML建立,那么需要覆写两个参数的,如果XML建立还想带样式,那么就必须同时覆写三个参数的构造方法了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询