简体   繁体   中英

android : How to start a new activity from a non activity class?

I am implementing a game. I want to start a new activity when the game reaches a specific position. I am new on this website , if i lack something in my question please tell i will edit.

My Game.java file has that point which is :

Game.java

package com.example.experiment;

import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.MotionEvent;
import android.view.View;

public class Game extends View 
{
    int i=0,j=0;
    int hei=0,wid=0,div=0;
int MoUp=0,MoUpDo=0,Rd;
float TouchXU=0,TouchYU=0,TouchXD=0,TouchYD=0;
float CirX,CirY;
int Score=0,FinalScore;
boolean MoveUp=false,Move=false,NextObs=false;
Path Rpath=new Path();
Paint paint=new Paint();
String ScoreStr="";
GamEnd g=new GamEnd(getContext());
Intent intent=new Intent();
Context context;
public Game(Context context)
{
    super(context);
}
@Override
public void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    paint.setAntiAlias(true);
    setBackgroundColor(Color.parseColor("#3E8E21"));
    MainPath(canvas);
    Obstacle1(canvas);
    Ball(canvas);
    Scores(canvas);
}
public void Ball(Canvas canvas)
{
    CirX=getWidth()/2;
    CirY=(getHeight()/2+getHeight()/4);
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.BLUE);
    paint.setStyle(Paint.Style.FILL);
    if(i<9)
    {
        postInvalidateDelayed(40);
        canvas.drawCircle(CirX, CirY+i, 30, paint);
        i+=3;
        Score+=10;
    }
    else if(MoveUp==true)
    {
        if(MoUp<200)
        {
            postInvalidateDelayed(30);
            canvas.drawCircle(CirX, CirY+i-MoUp, 30, paint);
            MoUp+=40;
            Score+=10;
        }
        else
        {
            postInvalidateDelayed(25);
            canvas.drawCircle(CirX, CirY+i-j+MoUpDo-MoUp, 30, paint);
            MoUpDo+=40;
            Score+=10;
            if(MoUpDo==200) 
            {
                MoUp=0;
                MoUpDo=0;
                MoveUp=false;
            }
        }
    }
    else
    {
        postInvalidateDelayed(40);
        canvas.drawCircle(CirX, CirY+i-j, 30, paint);
        j+=3;
        Score+=10;
        if(j==9) 
        {
            i=0;
            j=0;
        }
    }
    if(hei>=CirY-15 && hei<=CirY+10 && MoveUp==false)
    {
        FinalScore=Score;
        Intent in=new Intent(context,GameEndActivity.class);
        in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(in);
    }
}
public void MainPath(Canvas canvas)
{
    paint.setColor(Color.parseColor("#EE874B"));
    paint.setStyle(Paint.Style.FILL);
    Rpath.moveTo(getWidth()/2-getWidth()/6,0);
    Rpath.lineTo(getWidth()/2+getWidth()/6,0);
    Rpath.lineTo(getWidth()/2+getWidth()/3,getHeight());
    Rpath.lineTo(getWidth()/2-getWidth()/3,getHeight());
    Rpath.lineTo(getWidth()/2-getWidth()/6,0);
    canvas.drawPath(Rpath, paint);
    Rpath.reset();
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
    switch(event.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        TouchXD=(float)event.getRawX();
        TouchYD=(float)event.getRawY();
        break;
    case MotionEvent.ACTION_UP:
        TouchXU=(float)event.getRawX();
        TouchYU=(float)event.getRawY();
        break;
    case MotionEvent.ACTION_MOVE:
        Move=true;
        break;
    }
    if(TouchYD>TouchYU && Move==true)
    {
        MoveUp=true;
        Move=false;
    }
    return true;
}
public void Scores(Canvas canvas)
{
    paint.setColor(Color.parseColor("#4CB028"));
    paint.setTextSize(20);
    paint.setTextSkewX((float) 0.1);
    paint.setFakeBoldText(true);
    ScoreStr=String.valueOf(Score);
    canvas.drawText(ScoreStr, 10, 30, paint);
}
public void Obstacle1(Canvas canvas)
{
    paint.setColor(Color.BLACK);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(20);
    canvas.drawLine(getWidth()/2-getWidth()/6-wid, hei, getWidth()/2+getWidth()/6+wid, hei, paint);
    float heiDiv=getHeight()/40;
    float widDiv=(getWidth()/3-getWidth()/6)/40;
    wid+=widDiv;
    hei+=heiDiv;
    if(hei>=getHeight())
    {
        NextObs=true;
        hei=0;
        wid=0;
        Obstacle1(canvas);
    }
}

}

GameEndActivity.java

package com.example.experiment;

import android.app.Activity;
import android.os.Bundle;

public class GameEndActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(new GameEnd(this));
    }
}

GameEnd.java

package com.example.experiment;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class GameEnd extends View
{
    Paint paint=new Paint();
    public GameEnd(Context context)
    {
        super(context);
    }
    @Override
    public void onDraw(Canvas canvas)
    {
        setBackgroundColor(Color.BLACK);
        paint.setColor(Color.YELLOW);
        paint.setTextSize(50);
        canvas.drawText("Hello", 10, 100, paint);
    }
}

My Error Log

08-28 09:24:20.120: E/AndroidRuntime(1153): FATAL EXCEPTION: main
08-28 09:24:20.120: E/AndroidRuntime(1153): Process: com.example.experiment, PID: 1153    
08-28 09:24:20.120: E/AndroidRuntime(1153): java.lang.NullPointerException
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.content.ComponentName.<init>(ComponentName.java:77)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.content.Intent.<init>(Intent.java:3813)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at com.example.experiment.Game.Ball(Game.java:94)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at com.example.experiment.Game.onDraw(Game.java:39)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.View.draw(View.java:14465)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.View.draw(View.java:14350)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.View.draw(View.java:14348)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.View.draw(View.java:14348)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.View.draw(View.java:14468)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.widget.FrameLayout.draw(FrameLayout.java:472)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2326)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2496)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewRootImpl.draw(ViewRootImpl.java:2409)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2253)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1883)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.Choreographer.doCallbacks(Choreographer.java:574)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.Choreographer.doFrame(Choreographer.java:544)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.os.Handler.handleCallback(Handler.java:733)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.os.Handler.dispatchMessage(Handler.java:95)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.os.Looper.loop(Looper.java:136)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at java.lang.reflect.Method.invokeNative(Native Method)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at java.lang.reflect.Method.invoke(Method.java:515)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-28 09:24:20.120: E/AndroidRuntime(1153):     at dalvik.system.NativeStart.main(Native Method)

I am getting a NullPointerException .

Please help.

Change this Constructor

 public Game(Context context)
 {
   super(context);
   this.context = context;
  }

If I got your question right, the crash occurs in the Ball() method. LokiSinclair is right, we need the code of Game.java and preferably also the stack trace to be 100% sure about where the NPE is thrown.

Nevertheless, most probably the problem is that context is not correctly set up. Please check on that.

You forgot to set incoming context to Game's context property

public Game(Context context) {
    super(context);
    this.context = context;
}

or remove that property and use view's context:

Intent in = new Intent(((Activity)getContext()),GameEndActivity.class);
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
((Activity)getContext()).startActivity(in);

View getContext() Returns the context the view is running in, through which it can access the current theme, resources, etc.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM