21

我是新手我在创建游戏时遇到问题

执行过程

activity_main.xml -> MainActivity.java -> GameLoop.java -> action.xml(错误) -> CustomView.java

Custom view CustomView is not using the 2- or 3-argument View constructors; XML attributes will not work

我不明白......

4

4 回答 4

58

您需要在 CustomView 中重写 View 的其他 2 个构造函数:

public CustomView(Context context) {
    super(context);
    init(context);
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

private void init(Context context) {
    //do stuff that was in your original constructor...
}
于 2012-12-10T08:39:26.120 回答
11

您还需要实现这些构造函数:

//Constructor that is called when inflating a view from XML.
View(Context context, AttributeSet attrs)

//Perform inflation from XML and apply a class-specific base style.
View(Context context, AttributeSet attrs, int defStyle)
于 2012-12-10T08:40:01.170 回答
1

我认为这取决于您如何创建自定义视图以及您将如何使用它。
并非所有 3 个构造函数都是真正必要的。
如果您使用属性 xml 文件创建视图,但不使用 defstyle,则足以调用

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs);
    //Your code
}

如果你不使用属性和 defstlye /我看到了这个的例子/你很乐意只打电话

public CustomView(Context context) {
    super(context);
    //Your code
}

如果你也想使用 defstyle 和属性

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs);
    //Yourcode
}
于 2014-03-09T09:05:08.503 回答
0

如果有人使用 Kotlin,他/她可以这样做:

class KotlinView @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr)

您可以在此处找到此解决方案和更多详细信息:https ://antonioleiva.com/custom-views-android-kotlin/

于 2020-05-28T09:42:25.153 回答