Android:默认构造函数的隐式超级构造函数未定义

时间:2012-12-12 02:09:50

标签: java android constructor

好的,首先,我知道你以前见过这个问题,我会告诉你为什么会有这个不同。我有一个类,DrawView(遵循一些Canvas教程),它扩展了View。好的,但我想要一个单独的类来处理所有的动画,所以我可以调用,例如,mainMenuAnimation(),它将绘制它而不是编码到实际的游戏循环。好吧,如果我创建一个用于保存动画,Animations.java和扩展DrawView的类,我会从Eclipse中收到错误:

Implicit super constructor DrawView() is undefined for default constructor. Must define an explicit constructor

问题是,如果我调用DrawView()构造函数,它会创建一个新的Animations.java,依此类推。 (也许我应该定义Animations a = new Animations()?不确定我以后是否会遇到问题)。所以,如果我在DrawView()中添加一个空构造函数,它会给我这个错误:

    Implicit super constructor View() is undefined for default constructor. Must define an explicit constructor

我不知道该怎么办,帮忙?

好的,我在DrawView()构造函数中实例化动画的原因是因为Animations'构造函数必须是超级(上下文),访问上下文的唯一方法是通过DrawView()构造函数。

DrawView构造函数代码:

Paint paint; //initialize EVERYTHING
Resources res;
Bitmap title;
Rect titleRect;
boolean inMainMenu, issetBackgroundDrawableSupported;
List<BitmapDrawable> mainMenuAnimation;


int mainMenuAnimationIndex = 0;

public DrawView(Context context) {
    super(context);  
    res = getResources(); //required stuff

    title = BitmapFactory.decodeResource(getResources(),R.drawable.title); //title stuff
    titleRect = new Rect(res.getDisplayMetrics().widthPixels/2 - title.getWidth()*10 , 100, res.getDisplayMetrics().widthPixels/2 + title.getWidth()*10, 200); //left, top, right, bottom

    inMainMenu = false; //main menu stuff
    issetBackgroundDrawableSupported = true;
    mainMenuAnimation = new ArrayList<BitmapDrawable>();
    mainMenuAnimation.add(new BitmapDrawable(getResources(), BitmapFactory.decodeResource(res, R.drawable.mainmenu_background_1)));
    mainMenuAnimation.add(new BitmapDrawable(getResources(), BitmapFactory.decodeResource(res, R.drawable.mainmenu_background_2)));
    mainMenuAnimation.add(new BitmapDrawable(getResources(), BitmapFactory.decodeResource(res, R.drawable.mainmenu_background_3)));

    Animations animations = new Animations(getApplication());
}

和Animations.java代码:

public class Animations extends DrawView {
//define animations
@SuppressLint("NewApi")
public void mainMenuScroll(Canvas canvas) {
    inMainMenu = true;
    //draw main menu here
    if (inMainMenu = true) { //main menu loop
        if (issetBackgroundDrawableSupported) { //check if background drawing is supported
            try {
                setBackgroundDrawable(mainMenuAnimation.get(mainMenuAnimationIndex));
            } catch (Exception e){
                issetBackgroundDrawableSupported = false; //say it is unsupported
                setBackground(mainMenuAnimation.get(mainMenuAnimationIndex));
            }
        }

        else {
            setBackground(mainMenuAnimation.get(mainMenuAnimationIndex));
        }

        mainMenuAnimationIndex++;
        if (mainMenuAnimationIndex == 3) { //restart main menu animation
            mainMenuAnimationIndex = 0;
        }
    }
}

}

好的,我意识到另一个Eclipse通知可能有用。它说:

Custom view com/spng453/agenericrpg/Animations is missing constructor used by tools: (Context) or (Context,AttributeSet) or (Context,AttributeSet,int)

听起来很相关,但我不知道该怎么办。

1 个答案:

答案 0 :(得分:1)

所有View都在Context的上下文中运行。 (我猜这就是为什么它被称为= P)。 这包括您的自定义视图

您将要定义一个Animations构造函数,该构造函数需要Context,因此您可以将其传递给超级构造函数。这是摆脱错误的最简洁方法,也将解决您提到的最后一个问题(即,Android系统正在尝试实例化您的类,但它不知道如何处理View它的构造函数中没有Context

public Animations(Context context) {
    super(context);  
}