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

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

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

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

Android Studio

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

Q&A

解決済

1回答

805閲覧

ゲームリセットがうまくできません。

aruko

総合スコア47

Java

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

Android Studio

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

0グッド

0クリップ

投稿2021/12/24 10:29

やりたいことは以下のようです。
〇 ダイアログのボタンをタップすると、MainActivityの最初の段階に戻る(OnCreateの状態)

つまり、ゲームリセットすることですが、ダイアログのボタンをタップすると、画面が消えてしまいます。

MainActivityでのsyokisettei()で、ゲームリセットをさせようと試みましたが、エラーになります。

エラー内容は、

android.view.ViewRootImpl$CalledFromWrongThreadException : Only the original thread that created a view hierarchy can touch its views.ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

です。
どのようにしたらエラーがなくなるのか、教えていただきたいです。
よろしくお願いします。

エラーはMainActivityでのrun()の

if(flag_syokisettei){syokisettei();}

syokisettei()の

for(int i=0;i<9;i++){

ma_tv[i]=(TextView)this.findViewById(ma_tvId[i]); **ma_tv[i].setVisibility(View.INVISIBLE);** **ma_tv[i].setText(ma_tvNar0[i]);**

}

の太字のところで起きています

MainActivity.javaです。(関係ある部分)

java

1public class MainActivity extends AppCompatActivity implements Runnable { 2 ImageView saru1,saru2; 3 int count,count_dialog; 4 Thread thread; 5 static Animation anim_nar; 6 static int w,h;//画面サイズ取得 7 static boolean flag_count,flag_count_dialog,flag_syokisettei; 8 boolean flag_anim_nar; 9 static int dialog_num; 10 ImageView kaki[]=new ImageView[24];//柿全部24こ 11 int kakiImageId[]=new int[]{R.id.kaki0,R.id.kaki1, R.id.kaki2,R.id.kaki3, R.id.kaki4,R.id.kaki5, R.id.kaki6,R.id.kaki7, R.id.kaki8,R.id.kaki9, R.id.kaki10,R.id.kaki11, R.id.kaki12,R.id.kaki13, R.id.kaki14,R.id.kaki15, R.id.kaki16,R.id.kaki17, R.id.kaki18,R.id.kaki19, R.id.kaki20,R.id.kaki21, R.id.kaki22,R.id.kaki23};;//柿24このImageId 12 List<Integer> list_kaki24 = new ArrayList<>(); 13 List<Integer> list_kaki_select = new ArrayList<>(); 14 static int kaki_kazu;//サルがとる柿の数 15 int px;//サル画像の左側のマージン 16 int kaki_num;//とる柿ナンバー(配列) 17 float x;//とる柿のX座標 18 float y;//とる柿のy座標 19 //EditText dc_ma_editText; 20 static TextView tuyosa; 21 static TextView yasasisa; 22 23 TextView ma_tv[]=new TextView[9];//TextView9こ 24 int ma_tvId[]=new int[]{R.id.ma_tv0,R.id.ma_tv1,R.id.ma_tv2,R.id.ma_tv3,R.id.ma_tv4,R.id.ma_tv5,R.id.ma_tv6,R.id.ma_tv7,R.id.ma_tv8}; 25 String ma_tvNar0[]=new String[]{"わしといっしょに、","いやいや、きみがわしになって、","ぼうけんをしてくれるかのう?","むかし、","けがをしたさるをたすけたが、","そのご、どうなったのか、","きになっとる。","",""}; 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.activity_main); 31 32 tuyosa=(TextView)findViewById(R.id.tuyosa); 33 yasasisa=(TextView)findViewById(R.id.yasasisa); 34 anim_nar = AnimationUtils.loadAnimation(this, R.anim.anim_nar); 35 saru1 = findViewById(R.id.saru1); 36 saru2 = findViewById(R.id.saru2); 37 38 syokisettei(); 39 } 40 public void onWindowFocusChanged(boolean hasFocus) { 41 super.onWindowFocusChanged(hasFocus); 42 View view = findViewById(R.id.ma_app_screen); 43 h = view.getHeight(); 44 w = view.getWidth(); 45 if (list_kaki_select.size() != 0) { 46 kaki_getXY(); 47 kaki_saru_keisan_animation(); 48 start(); 49 } 50 } 51 public void start(){ 52 if(thread==null){ 53 thread=new Thread(this); 54 thread.start(); 55 } 56 } 57 public void stop(){ 58 if(thread!=null){ 59 thread=null; 60 } 61 } 62 public void run() { 63 Thread thisThread=Thread.currentThread(); 64 final Handler mainHandler = new Handler(Looper.getMainLooper()); 65 while (thread!=null){ 66 67 if(flag_count){count++;} 68 if(flag_anim_nar==false&&flag_count_dialog){ 69 count_dialog++; 70 if(count_dialog==1){show_dialog();} 71 } 72 if(flag_syokisettei){syokisettei();} 73 mainHandler.post(() -> { 74 ma_tv[8].setVisibility(View.VISIBLE); 75 ma_tv[8].setText("list_kaki_select="+list_kaki_select+" : count=" + count+" : count_dialog="+count_dialog+" : flag_count="+flag_count+" : flag_count_dialog="+flag_count_dialog+" : dialog_num="+dialog_num); 76 if(flag_anim_nar&&count>=6&&count%3==0&&count<=24){ 77 ma_tv[(count/3)-2].setVisibility(View.VISIBLE); 78 ma_tv[(count/3)-2].startAnimation(anim_nar); 79 if(count==24){flag_anim_nar=false;} 80 } 81 }); 82 try { 83 thread.sleep(1000); 84 } catch (InterruptedException e) { 85 } 86 } 87 } 88 public void show_dialog(){ 89 dialog_num++; 90 DialogFragment dialog = new MyDialogFragment(); 91 dialog.show(getSupportFragmentManager(), "dialog_ma"); 92 flag_count_dialog = false; 93 count_dialog = 0; 94 flag_count = false; 95 } 96 public void syokisettei(){ 97 count = 0; 98 count_dialog=0; 99 flag_count=true; 100 flag_count_dialog=false; 101 flag_syokisettei=false; 102 dialog_num=0; 103 flag_anim_nar=true; 104 for(int i=0;i<9;i++){ 105 ma_tv[i]=(TextView)this.findViewById(ma_tvId[i]); 106 ma_tv[i].setVisibility(View.INVISIBLE); 107 ma_tv[i].setText(ma_tvNar0[i]); 108 } 109 for(int i=0;i<24;i++){ 110 kaki[i]=(ImageView)this.findViewById(kakiImageId[i]); 111 list_kaki24.add(i); 112 } 113 kimeru_kaki();//どの柿をいくつとるか決めておく 114 px = convertDPtoPX(100);//サル画像の左側のマージンが100dpをpxに変換 115 thread=null; 116 } 117}

MyDialogFragment.javaです。(関係ある部分)

java

1public class MyDialogFragment extends DialogFragment { 2 LayoutInflater inflater; 3 View view; 4 static String name; 5 static String messege; 6 public Dialog onCreateDialog(Bundle savedInstanceState){ 7 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 8 switch(dialog_num){ 9 ・・・・・・・ 10 case 3: 11 builder.setMessage("きょうからわしは、「"+name+"じい」じゃ。よろしくたのむ! なまえをつけてくれたおれいに、やさしさポイント10ポイントをあげるよ。") 12 //「はい」ボタンの設定 13 .setPositiveButton("OK", new DialogInterface.OnClickListener() { 14 @Override 15 public void onClick(DialogInterface dialog, int which) { 16 int point=10; 17 int yasasisa_point=Integer.parseInt(yasasisa.getText().toString()); 18 yasasisa.setText(String.valueOf(yasasisa_point+point)); 19 flag_count = true; 20 flag_count_dialog = true; 21 } 22 }); 23 break; 24 case 4: 25 builder.setMessage("あ、そうじゃ。ことしは、かきがたくさんなった。そろそろたべたいが、さっきから、さるがうろちょろしとる。かきをとっていったんだろう。" ) 26 //「はい」ボタンの設定 27 .setPositiveButton("つぎへ", new DialogInterface.OnClickListener() { 28 @Override 29 public void onClick(DialogInterface dialog, int which) { 30 flag_count = true; 31 flag_count_dialog = true; 32 } 33 }); 34 break; 35 case 5: 36 inflater=LayoutInflater.from(getActivity()); 37 view=inflater.inflate(R.layout.dialog_custom_ma1,null); 38 builder.setView(view) 39 .setMessage("さあて、ここで、"+name+"じいからもんだいじゃ。かきはいくつとられた? これにこたえられないと、さきへはすすめないシステムじゃ。"); 40 //「OK」ボタンの設定"" 41 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 42 @Override 43 public void onClick(DialogInterface dialog, int which) { 44 flag_count = true; 45 flag_count_dialog = true; 46 EditText dc_ma1_editText=(EditText)view.findViewById(R.id.dc_ma1_editText); 47 int kosuu=Integer.parseInt(dc_ma1_editText.getText().toString()); 48 if(kosuu==kaki_kazu){ 49 messege="よくみていたな。あっとるぞ。つぎへすすもう!"; 50 }else{ 51 messege="ちがっとる! これではさきにすすめん。さいしょからやりなおすか?"; 52 } 53 } 54 }); 55 break; 56 case 6: 57 if(messege=="よくみていたな。あっとるぞ。つぎへすすもう!") { 58 builder.setMessage(messege) 59 .setPositiveButton("つぎへ", new DialogInterface.OnClickListener() { 60 @Override 61 public void onClick(DialogInterface dialog, int which) { 62 flag_count = true; 63 flag_count_dialog = true; 64 } 65 }); 66 }else if(messege=="ちがっとる! これではさきにすすめん。さいしょからやりなおすか?"){ 67 builder.setMessage(messege) 68 .setPositiveButton("やりなおす", new DialogInterface.OnClickListener() { 69 @Override 70 public void onClick(DialogInterface dialog, int which) { 71 flag_syokisettei=true; 72 } 73 }) 74 //「いいえ」ボタンの設定 75 .setNegativeButton("ゲームをおわる", new DialogInterface.OnClickListener() { 76 @Override 77 public void onClick(DialogInterface dialog, int which) { 78 flag_count_dialog = false; 79 //ゲーム終了の処理 80 } 81 }); 82 } 83 break; 84 } 85 return builder.create(); 86 } 87} 88

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

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

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

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

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

guest

回答1

0

ベストアンサー

CalledFromWrongThreadException

この例外は、画面を更新する処理をメインスレッド以外で行った場合に発生します。
syokisettei で画面を更新するのであれば syokisettei をメインスレッドで実行する必要があり、別スレッドで実行されている run で実行する場合には mainHandler で post して実行する形にしなければなりません。

投稿2021/12/24 10:45

jimbe

総合スコア12670

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

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

aruko

2021/12/25 07:37

いつもありがとうございます。 前に教えていただいたrun()の中でmainHandlerを使ったことと同じだったのですね。 もう少し応用できる考えになるよう頑張ります。 問題解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問