Aearnus
Aearnus

Reputation: 541

Android: Implicit super constructer undefined for default constructer

Ok, first of all, I know you have seen this problem before, and I'll tell you why this is different. I have a class, DrawView (followed some Canvas tutorials) and it extends View. Ok, but I want a separate class to handle all the animations, so I can just call, for example, mainMenuAnimation() and it will draw it instead of coding it to the actual game loop. Well, if I create a class for holding the animations, Animations.java, and extend DrawView, I get an error from Eclipse:

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

The problem is, if I call the DrawView() constructor, it makes a new Animations.java, and so on. (Maybe I should define Animations a = new Animations()? Not sure if I would run into problems later on though). So, if I add an empty constructor in DrawView(), it gives me this error:

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

I have no idea what to do, help?

Okay, the reason why I instanced Animations in the DrawView() constructor is because Animations' constructor has to be super(context) and the only way to access the context is through the DrawView() constructor.

DrawView constructor code:

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());
}

And the Animations.java code:

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;
        }
    }
}

}

Ok, I realized another Eclipse notification, might be useful. It says:

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

Sounds relevant, but I'm not sure what to do about it.

Upvotes: 1

Views: 2870

Answers (1)

Cheezmeister
Cheezmeister

Reputation: 4985

All Views run within the context of a Context. (I guess that's why it's called that =P). This includes your custom View.

You're going to want to define an Animations constructor that takes a Context, so you can pass it through to the super constructors. This is the cleanest way to get rid of your errors, and will also fix the last problem you mentioned (namely, the Android system is trying to instantiate your class, but it doesn't know what to do with a View that doesn't take a Context in its constructor).

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

Upvotes: 1

Related Questions