Android:崩溃:二进制XML文件行:错误膨胀类(使用SurfaceView)

11 浏览
0 Comments

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类。

请帮我解决这个问题,谢谢。

0
0 Comments

问题的原因是在布局文件中使用了错误的类名进行类的填充。解决方法是将视图声明为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关键字解决了我的问题。

0