前提・実現したいこと
android studioで加速度のデータを使いボールを動かすアプリを作成してます。
ゴール地点(Hole)にボールを止めて、止まったらゴールという文字を表示して、
画面をタッチすると最初の状態に戻すアプリを作りたいのですが、文字を表示するとアプリが強制的に終了してしまいます。
エラー文を見て調べてみたのですがよく分からなかったのでどうすれば文字を正常に表示できるようになりますか?
よろしくお願いします。
また、ボールが止まった時に最初の状態(起動したときの状態)に戻すときのヒントなど教えて頂けるとありがたいです。
発生している問題・エラーメッセージ
Process: com.example.myapplication, PID: 9091 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.example.myapplication.MainActivity.run(MainActivity.java:103) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
該当のソースコード
Java
1public class MainActivity extends Activity implements Runnable, SensorEventListener { 2 SensorManager manager; 3 Ball ball; 4 Hole hole; 5 Handler handler; 6 int width, height, time; 7 float gx, gy, dpi; 8 TextView textView1; 9 FrameLayout framelayout; 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 getWindow().addFlags( 15 WindowManager.LayoutParams.FLAG_FULLSCREEN); 16 requestWindowFeature(Window.FEATURE_NO_TITLE); 17 framelayout = new FrameLayout(this); 18 framelayout.setBackgroundColor(Color.GREEN); 19 setContentView(framelayout); 20 21 time = 10; 22 handler = new Handler(); 23 handler.postDelayed(this, 3000); 24 25 WindowManager windowManager = 26 (WindowManager) getSystemService(WINDOW_SERVICE); 27 Display display = windowManager.getDefaultDisplay(); 28 Point size = new Point(); 29 display.getSize(size); 30 width = size.x; 31 height = size.y; 32 dpi = getResources().getDisplayMetrics().densityDpi; 33 34 ball = new Ball(this); 35 ball.x = width / 2; 36 ball.y = height / 2; 37 38 hole = new Hole(this); 39 Random rnd = new Random(); 40 hole.x = rnd.nextInt( 41 width - (2 * (hole.r + ball.radius))) 42 + hole.r + ball.radius; 43 hole.y = rnd.nextInt( 44 height - (2 * (hole.r + ball.radius))) 45 + hole.r + ball.radius; 46 47 framelayout.addView(hole); 48 framelayout.addView(ball); 49 } 50 @Override 51 public void run() { 52 ball.vx += (float) (gx * time / 1000); 53 ball.vy += (float) (gy * time / 1000); 54 ball.x += dpi * ball.vx * time / 25.4; 55 ball.y += dpi * ball.vy * time / 25.4; 56 57 if (ball.x <= ball.radius) { 58 ball.x = ball.radius; 59 ball.vx = -ball.vx / 3; 60 } else if (ball.x >= width - ball.radius) { 61 ball.x = width - ball.radius; 62 ball.vx = -ball.vx / 3; 63 } 64 65 if (ball.y <= ball.radius) { 66 ball.y = ball.radius; 67 ball.vy = -ball.vy / 3; 68 } else if (ball.y >= height - ball.radius) { 69 ball.y = height - ball.radius; 70 ball.vy = -ball.vy / 3; 71 } 72 73 if ((hole.x - hole.r < ball.x && 74 ball.x < hole.x + hole.r) && 75 (hole.y - hole.r < ball.y && 76 ball.y < hole.y + hole.r)) { 77 ball.x = hole.x; 78 ball.y = hole.y; 79 ball.vx = ball.vy = 0; 80 ball.invalidate(); 81 textView1.setText("ゴール"); 82 } else { 83 ball.invalidate(); 84 handler.postDelayed(this, time); 85 } 86 } 87 public void onDestroy() { 88 super.onDestroy(); 89 handler.removeCallbacks(this); 90 } 91 @Override 92 protected void onResume() { 93 super.onResume(); 94 manager = (SensorManager)getSystemService( 95 SENSOR_SERVICE); 96 List<Sensor> sensors = 97 manager.getSensorList( 98 Sensor.TYPE_ACCELEROMETER); 99 if (0 < sensors.size()) { 100 manager.registerListener( 101 this, sensors.get(0), 102 SensorManager.SENSOR_DELAY_NORMAL); 103 } 104 } 105 @Override 106 protected void onPause() { 107 super.onPause(); 108 manager.unregisterListener(this); 109 } 110 @Override 111 public void onSensorChanged(SensorEvent event) { 112 gy = event.values[0]; 113 gx = event.values[1]; 114 } 115 @Override 116 public void onAccuracyChanged( 117 Sensor sensor, int accuracy) { 118 } 119} 120
Java
1public class Ball extends View { 2 int x, y, radius; 3 float vx, vy; 4 Paint paint; 5 6 public Ball(Context context) { 7 super(context); 8 radius = 90; 9 vx = vy = x = y = 0; 10 paint = new Paint(); 11 paint.setColor(Color.WHITE); 12 paint.setStyle(Paint.Style.FILL); 13 } 14 protected void onDraw(Canvas canvas){ 15 super.onDraw(canvas); 16 canvas.drawCircle(x, y, radius, paint); 17 } 18}
Java
1public class Hole extends View { 2 int x, y, r; 3 Paint p; 4 5 public Hole(Context context){ 6 super(context); 7 x = y = 0; 8 r = 100; 9 p = new Paint(); 10 p.setColor(Color.BLACK); 11 p.setStyle(Paint.Style.FILL); 12 p.setAntiAlias(true); 13 } 14 protected void onDraw(Canvas canvas) { 15 super.onDraw(canvas); 16 canvas.drawCircle(x, y, r, p); 17 } 18}
Java(activity_main.xml)
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <TextView 10 android:id="@+id/text_view1" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:layout_margin="20dp" 14 android:textColor="#44f" 15 android:textSize="20sp" 16 app:layout_constraintBottom_toBottomOf="parent" 17 app:layout_constraintHorizontal_bias="0.501" 18 app:layout_constraintLeft_toLeftOf="parent" 19 app:layout_constraintRight_toRightOf="parent" 20 app:layout_constraintTop_toTopOf="parent" 21 app:layout_constraintVertical_bias="0.1" /> 22
試したこと
ボールが止まるif文の中でTextviewを表示するようにしています。
Text Viewの場所などを変えて記述してみたのですが画面に表示されずにアプリが強制終了してしまいました。
補足情報(FW/ツールのバージョンなど)
Android Studio 3.6.3
android8.1(API:27)
Java
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/19 10:16
2020/05/19 10:24
2020/05/19 10:42
2020/05/19 13:04
2020/05/19 14:13