2

何らかの理由で、実装しようとしているためにクラスメッセージを膨張させるエラーが発生し続けます

原因: java.lang.NullPointerException at pap.crowslanding.GameView.(GameView.java:49)

49号線はこちら

WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

私はアクティビティに参加していないので、このようにしています。何か提案はありますか?

編集:

public class GameView extends SurfaceView {
static final long FPS = 10;
public Bitmap bmp;
public SurfaceHolder holder;
public LoopGameThread loopGameThread;
public static Sprite sprite;
public LayoutInflater inflater;

//maze variables
  public int width;                 
  public int height;
  private float cellWidth;
  private boolean[][] north;     // is there a wall to north of cell i, j
  private boolean[][] east;
  private boolean[][] south;
  private boolean[][] west;
  private boolean[][] visited;
  private double size;
  boolean done = false;

  Display display = new 
  Paint paint = new Paint();




//maze variables
   public GameView(Context context) {
    super(context);
   WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
   Display display = wm.getDefaultDisplay();
   Point screenSize = new Point();
    display.getSize(screenSize);
    int width = screenSize.x;
    int height = screenSize.y;

}
public GameView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO
}

public GameView(Context context, AttributeSet attrs) {

    super(context, attrs);

    //maze variables
    initVars(attrs);
    initMaze();
    generate(1, 1);
    //maze variables
    loopGameThread = new LoopGameThread(this);
    holder = getHolder();

    holder.addCallback(new Callback() {

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format,
                int width, int height) {

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            loopGameThread.isStart(true);
            loopGameThread.start();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }

    });

    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.crow);
    sprite = new Sprite(this, bmp);

}


//MAZE VARIABLES

private void initVars(AttributeSet attrs) {
      //requires display variables
  }

次に、initVars 内で、これらの表示変数を使用する必要があります

編集2:

package pap.crowslanding;


import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.Button;

public class Game extends MainActivity{
static boolean pressedUp = false;
 protected static GameView gameV;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.tester1);


    Button moveLeft = (Button) findViewById(R.id.button1);
    gameV = (GameView)findViewById(R.id.game_view);



    moveLeft.setOnTouchListener(new View.OnTouchListener() {

        private Handler mHandler;

        @Override public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (mHandler != null) return true;
                mHandler = new Handler();
                mHandler.postDelayed(mAction, 100);
                break;
            case MotionEvent.ACTION_UP:
                if (mHandler == null) return true;
                mHandler.removeCallbacks(mAction);
                mHandler = null;
                break;
            }
            return false;
        }

        Runnable mAction = new Runnable() {
            @Override public void run() {
                System.out.println("Performing action...");
                mHandler.postDelayed(this, 100);
                GameView.sprite.movementGo();
            }
        };

    });
}       

}

4

1 に答える 1

3

この関数を呼び出しているクラスにコンテキストを渡す必要があります。

たとえば、関数で参照できるローカル コンテキスト値をクラスに保持できます。まず、使用するクラスにコンテキストを渡すコンストラクターを作成する必要があります。

public class Example {
    Context mContext;

    public Example(Context mContext;){
        this.mContext = mContext;
    }

    public someFunction(){
        ...
        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        ...
     }
}

クラスのインスタンスを作成して使用する Activity クラスでは、次のように Activity のコンテキストを渡す必要があります。

public class SomeActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Example test = new Example(this); //You are passing in the Activity as the context here
        test.someFunction();

    }
}

あなたの編集に編集:

GameView クラスに新しいローカル変数を作成します。

private Context mContext;

mContext次に、次のように GameView コンストラクターに値を割り当てます。

 public GameView(Context context) {
      super(context);
      mContext = context;
      ...
  }

関数mContext内で使用できるようになりましたinitVars()

于 2013-04-17T14:14:38.387 に答える