通过XML加载SurfaceView时出现NoSuchMethodException

时间:2013-12-02 22:57:26

标签: android

目前我有一个扩展Activity的类,内部类(“GameView”)扩展了SurfaceView(并实现了Runnable)

public class GameSurface extends Activity implements OnTouchListener 

public  class GameView extends SurfaceView implements Runnable 

一切正常,但我决定在View中添加一些按钮,而不是绘制位图,而是使用FrameLayout并将按钮作为ImageButtons加载到Canvas顶部。

所以我尝试通过XML加载GameView,如下所示:

game_layout.xml

<view
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.appname.game.GameSurface$GameView" >
</view>

所以现在我创建了一个扩展Activity的新类并且做了

            setContentView(R.layout.gamescreen);

虽然没有工作。我得到一些错误/异常

Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class com.appname.game.GameSurface$GameView

Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]

所以我在NoSuchMethodException上发现了一些关于StackOverflow的问题,并发现最后一个错误与缺少或不可用的构造函数有关。 构造函数都在那里,包括错误中提到的那个。

public GameView(Context context, AttributeSet attributeSet){
        super(context, attributeSet);

        //bunch of code
}

所以我假设构造函数不可访问,其他答案提到我应该使构造函数静态。问题是代码现在对非静态方法和字段进行静态引用,这是不可能的,并导致很多错误。

如果不做太多改动,我能做些什么是最好的? 如果需要更多信息以获得更清晰的视图,我非常乐意提供它。感谢

更新: 堆栈跟踪 http://pastebin.com/ZtZQUv7B

1 个答案:

答案 0 :(得分:1)

内部类需要是静态的。我无法看到它周围。您需要根据需要使用接口进行足够的重构。 class="com.appname.game.GameSurface$GameView"将搜索并创建一个由属性值定义的类,而无需关心或了解实例化的类。