CarbonZonda
CarbonZonda

Reputation: 167

Cannot use context in class?

I'm currently trying to put in a color from my colors resources xml into my app using ContextCompact.getColor() but for some reason I cannot pass in a single version of context.

I'm using a class as a handler so I am not trying to pass in from an activity. In my activity I can use them, but in my class I cannot pass in getActivityContext() this etc. Nothing works. What do I do?

Also, I'm adding the color to a canvas so I cannot add the color in in an xml.

canvas.drawColor(Color.BLACK);

Is what I'm currently forced to use. I want to replace it with a color from my xml. ( I'm trying to set the background of the canvas essentially )

full code of my class: (I'm making this app as a "note" app so that I can look back on it for future projects, hence all the comments)

public class GameHandling {

    private SurfaceHolder holder;
    private Resources resources;

    private int screenWidth;
    private int screenHeight;

    private Ball ball;
    private Bat player;
    private Bat opponent;

    public GameHandling(int width, int height, SurfaceHolder holder, Resources resources){
        this.holder = holder;
        this.resources = resources;
        this.screenWidth = width;
        this.screenHeight = height;

        this.ball = new Ball(screenWidth, screenHeight, 400, 400);
        this.player = new Bat(screenWidth, screenHeight, 0, 0, Bat.Position.LEFT);
        this.opponent = new Bat(screenWidth, screenHeight, 0, 0, Bat.Position.RIGHT);
    }

    // setting the ball images to be drawn
    public void inIt(){

        Bitmap ballShadow = BitmapFactory.decodeResource(resources, R.mipmap.grey_dot);
        Bitmap ballImage = BitmapFactory.decodeResource(resources, R.mipmap.red_dot);
        Bitmap batPlayer = BitmapFactory.decodeResource(resources, R.mipmap.bat_player);
        Bitmap batOpponent = BitmapFactory.decodeResource(resources, R.mipmap.bat_opponent);

        ball.inIt(ballImage, ballShadow, 2, 0);
        player.inIt(batPlayer, batPlayer, 0, 0);
        opponent.inIt(batOpponent, batOpponent, 0, 0);
    }

    // calling Balls update method to update the ball
    public void update(long elapsed){
        ball.update(elapsed);
    }
    public void draw(){
        Canvas canvas = holder.lockCanvas(); // Making a canvas object to draw on - .lockcanvas locks canvas

        if(canvas != null) {
            // draw in area between locking and unlocking

            canvas.drawColor(Color.BLACK);
            ball.draw(canvas);
            player.draw(canvas);
            opponent.draw(canvas);

            holder.unlockCanvasAndPost(canvas); //-unlockcanvasandposts unlocks the canvas
        }


    }
}

Upvotes: 2

Views: 194

Answers (2)

Gokhan Arik
Gokhan Arik

Reputation: 2766

Change your constructor to this and use ContextCompat.getColor(context,... pattern.

Wherever you are creating this class (activity/fragment), pass the context calling either getActivity() or getApplicationContext()

new GameHandling( getActivity()/getApplicationContext(), ...)

public GameHandling(Context context, int width, int height, SurfaceHolder holder, Resources resources){
    this.context = context;
    this.holder = holder;
    this.resources = resources;
    this.screenWidth = width;
    this.screenHeight = height;

    this.ball = new Ball(screenWidth, screenHeight, 400, 400);
    this.player = new Bat(screenWidth, screenHeight, 0, 0, Bat.Position.LEFT);
    this.opponent = new Bat(screenWidth, screenHeight, 0, 0, Bat.Position.RIGHT);
}

Upvotes: 2

CarbonZonda
CarbonZonda

Reputation: 167

I kind of came up with a workaround, I created an image with my desirable color and then used that as the background of the app.

However it is still a workaround, so it doesn't solve my issue

Upvotes: 0

Related Questions