Android:崩溃:二进制XML文件行:错误膨胀类(使用SurfaceView)
Android:崩溃:二进制XML文件行:错误膨胀类(使用SurfaceView)
我正在使用Android的SurfaceView,并尝试在其上添加按钮。
在SurfaceView的画布上我绘制了一些东西,并且有一个线程类来保持绘制。
线程类:
包括SurfaceHolder和SurfaceView类。
有一个setRunning方法用于设置线程是否运行。
在run方法中,通过SurfaceHolder锁定画布,然后在同步块中调用SurfaceView的onDraw方法进行绘制。
最后,释放画布并解锁SurfaceHolder。
SurfaceView和用于绘图的类:
包括一个继承自SurfaceView的MySurfaceView类,实现了SurfaceHolder.Callback接口。
在MySurfaceView类中,初始化了SurfaceHolder,并创建了一个MySurfaceThread线程。
重写了onDraw方法,在画布上绘制一个简单的移动圆。
在surfaceCreated方法中启动了线程,而在surfaceDestroyed方法中停止了线程。
主布局文件main.xml中包含了两个按钮和一个FrameLayout,其中嵌套了MySurfaceView。
问题是,如果MySurfaceView作为内部类,就会出现错误。如果将MySurfaceView作为独立的类,就没问题。
错误信息显示无法找到com.androidsurfaceview.test.MySurfaceView类。
请帮我解决这个问题,谢谢。
问题的原因是在布局文件中使用了错误的类名进行类的填充。解决方法是将视图声明为static
类型,并在布局文件中使用正确的类名。
首先,必须将视图声明为static
类型,即使没有可用的持有类的实例也可以填充它:
public static class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback
布局文件中的这行代码:
<com.androidsurfaceview.test.MySurfaceView
表明MySurfaceView
类位于com.androidsurfaceview.test
包中,并试图从那里填充它,这是错误的。
在布局文件中,应该按照package.class$innerclass
的形式进行声明。
但是,由于"$"
是非法字符,你不能写成:
<com.androidsurfaceview.test$MySurfaceView
所以你必须在布局文件中将视图指定为如下所示:
<view class="com.androidsurfaceview.test$MySurfaceView" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
这样就可以正常工作了。
感谢!它起作用了。我最初也尝试将类设置为静态的。但我不知道我必须使用view类和$进行设置。你推荐我学习哪个教程或书籍呢?
通过阅读Android Developers的有趣主题,我学到了很多知识,但是有很多教程和示例。我最喜欢的是Ericksson的技巧和示例。
即使使用了正确的XML,我仍然遇到了相同的错误,我应该开一个新的问题吗?它完全相同,只是按照你说的进行了更正。
请注意,包声明中的test是持有MySurfaceView静态类的类的名称。它可能会让人困惑,因为它以小写字母开头。
谢谢你,将内部类添加static关键字解决了我的问题。