質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

2567閲覧

AndroidStudioでのTextViewの表示エラー

handlehandle

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/05/19 09:49

編集2020/05/19 10:35

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

取り急ぎエラーの件だけ回答させて頂きます。
TextViewのインスタンスを生成していないのでエラーが発生していると思います。
以下記述を追加したら、テキスト表示に関しては改善しないでしょうか。

java

1@Override 2protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 5 〜省略〜 6 textView1 = (TextView)findViewById(R.id.text_view1); 7}

追記

すみません。再度ソース確認致しました。
TextViewがNullになってしまうのは、onCreateメソッド内で、setContentView(framelayout);としており、MainActivityのレイアウトファイルを読み込んでないからではないでしょうか?

// setContentView(framelayout); // こちらはコメントアウト setContentView(R.layout.activity_main); // ここの引数を、質問者様のレイアウトファイルに変更(左記は仮で設定しております) textView1 = findViewById(R.id.text_view1);

という様に変更したら、とりあえずはTextViewのNull問題は解決しませんでしょうか。
また解決しなかったら申し訳ありません。。

投稿2020/05/19 10:10

編集2020/05/19 13:42
tsuki01

総合スコア1751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2020/05/19 10:16

API 26以降ではfindViewById()の戻り値のキャストは不要になりました。
handlehandle

2020/05/19 10:24

ありがとうございます。 入力してみたのですが同じようにエラーになってしまいました。
tsuki01

2020/05/19 10:42

keicha_hrs様 ご指摘ありがとうございました。勉強になります。 質問者様 エラー解決しなかったということで、お役に立てず申し訳ありません。
tsuki01

2020/05/19 13:04

回答に追記しました。 こちらでも解決しなかったら大変申し訳ないです。。
handlehandle

2020/05/19 14:13

ありがとうございます!できるようになりました! 分かりやすく教えて頂きありがとうございました!
guest

0

ベストアンサー

textView1という変数が宣言されていますが、ここに何の値も代入されることのないまま

java

1 textView1.setText("ゴール");

で参照しています。textView1はnullのままですから、これではnull参照の例外(NullPointerException)でアプリが落ちます。

どこか(onCreate()の中?)で

java

1 textView1 = findViewById(R.id.text_view1);

とする必要があるのではないでしょうか。


あー、これコードで作成したFrameLayoutを描画しているのですね。すると、レイアウトXMLに配置したTextViewは画面上のどこにも存在しませんから、これをfindViewById()で取得することもできません。これは設計の方向性を改めないと解決できないでしょう。

一つの方法としてですが、次のように修正してみてはどうでしょうか。これだと、レイアウトXMLに配置したTextViewを扱えるので、文字の描画もできるでしょう。

activity_main.xml (android:idの追加)

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:id="@+id/root" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10(以下略)

MainActivity.java

java

1public class MainActivity extends AppCompatActivity implements Runnable, SensorEventListener { 2 3 //FrameLayout framelayout; // やめる 4 ConstraintLayout layout; // 代わりに新設 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 getWindow().addFlags( 10 WindowManager.LayoutParams.FLAG_FULLSCREEN); 11 requestWindowFeature(Window.FEATURE_NO_TITLE); 12 13 //framelayout = new FrameLayout(this); 14 //framelayout.setBackgroundColor(Color.GREEN); 15 //setContentView(framelayout); 16 17 // 代わりに追加する処理 18 setContentView(R.layout.activity_main); 19 layout = findViewById(R.id.root); 20 layout.setBackgroundColor(Color.GREEN); 21 textView1 = findViewById(R.id.text_view1); 22 23 (中略) 24 25 //framelayout.addView(hole); 26 //framelayout.addView(ball); 27 layout.addView(hole); 28 layout.addView(ball); 29 }

投稿2020/05/19 10:08

編集2020/05/19 13:12
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

handlehandle

2020/05/19 10:23

ありがとうございます。 onCreate()内に入力してみたのですが強制終了し、同じエラーが表示されてしまいました。
handlehandle

2020/05/19 14:11

ありがとうございます!できるようになりました! 丁寧に教えて頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問