Je suis un peu nouveau pour le développement d'applications Android, alors pardonnez mon code recrue. J'essaie de programmer un jeu basé sur le mouvement. Lorsque vous faites pivoter votre téléphone, il glisse un objet (un seau) de droite à gauche sur l'écran pour intercepter les objets qui tombent. J'ai une activité principale et un SurfaceView privé dans cette classe. J'ai aussi un thread personnalisé dans lequel cela fonctionne.Je ne peux pas dire pourquoi mon bitmap est nul. Devrait-il être initialisé ailleurs?
Ceci est l'erreur: EXCEPTION FATAL: principal processus: course.examples.databaseanimation, PID: 17583 java.lang.NullPointerException: tentative d'invoquer la méthode virtuelle 'int android.graphics.Bitmap.getWidth()' sur une référence d'objet null at android.graphics.Bitmap.createBitmap (Bitmap.java:659) à course.examples.databaseanimation.BucketThread. (BucketThread.java:25) à course.examples.databaseanimation.MainActivity $ BucketView. surfaceCreated (MainActivity.java:102) à android.view.SurfaceView.updateWindow (SurfaceView.java:582) à android.view.SurfaceView $ 3.onPreDraw (SurfaceView.java:177) à android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:944) à android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2067) à android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1119) à android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6060) à android.view.Choreographer $ CallbackRecord.run (Choreographer.java:858) à android.view.Choreographer.doCallbacks (Choreographer.java:670) à android.view.Choreographer.doFrame (Choreographer.java:606) à android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:844) à android.os.Handler.handleCallback (Handler.java:746) à android.os.Handler.dispatchMessage (Handler.java:95) à android.os.Looper.loop (Looper.java:148) à android.app.ActivityThread.main (ActivityThread.java:5443) à java.lang.reflect.Method.invoke (méthode native) à com. android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:728) à com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)
Ceci est mon fil:
public class BucketThread extends Thread {
private SurfaceHolder holder;
private boolean running = true;
private float shiftY;
private float vy;
private float x;
private Bitmap mBucket = Bitmap.createBitmap(BitmapFactory.decodeResource
(Resources.getSystem(), R.mipmap.ic_launcher));
public BucketThread(SurfaceHolder holder){
this.holder = holder;
x = 0;
}
public void run(){
while(running){
Canvas canvas = null;
try{
canvas = holder.lockCanvas();
synchronized (holder){
//update
vy += shiftY * 0.1;
x += vy;
//draw
Paint mPaint = new Paint();
canvas.drawBitmap(mBucket, x, 0, mPaint);
}
}
finally {
if(canvas != null){
holder.unlockCanvasAndPost(canvas);
}
}
}
}
public void setRunning(boolean r){
running = r;
}
public void setShift(float shiftY){
this.shiftY = shiftY;
}
}
Et ceci est mon activité principale:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout mainFrame = (RelativeLayout) findViewById
(R.id.main_frame);
BucketView bv = new BucketView(getApplicationContext());
mainFrame.addView(bv);
}
private class BucketView extends SurfaceView implements SurfaceHolder.Callback,
SensorEventListener {
//private final Bitmap mBucket;
//private DisplayMetrics mDisplay;
private SurfaceHolder mSurfaceHolder;
private BucketThread mBuckThread;
//private int mDisplayWidth;
//private float mY;
public BucketView(Context context) {
super(context);
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this);
SensorManager manager = (SensorManager) context.getSystemService
(Context.SENSOR_SERVICE);
if (manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0) {
Sensor accelerometer = manager.getSensorList(Sensor
.TYPE_ACCELEROMETER).get(0);
manager.registerListener(this, accelerometer, SensorManager
.SENSOR_DELAY_GAME);
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (mBuckThread != null) {
mBuckThread.setShift(event.values[1]);
Log.i("Main Activity", getClass().getSimpleName() + "onSensorChanged");
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mBuckThread = new BucketThread(holder);
mBuckThread.setRunning(true);
mBuckThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
mBuckThread.setRunning(false);
while (retry) {
try {
mBuckThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
}
}
Copie possible de [Qu'est-ce qu'une exception NullPointerException, et comment la réparer?] (Https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) – Daniele