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

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

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

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

Android Studio

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

解決済

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

aruko
aruko

総合スコア45

Java

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

Android Studio

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

1回答

0評価

0クリップ

283閲覧

投稿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

public class MainActivity extends AppCompatActivity implements Runnable { ImageView saru1,saru2; int count,count_dialog; Thread thread; static Animation anim_nar; static int w,h;//画面サイズ取得 static boolean flag_count,flag_count_dialog,flag_syokisettei; boolean flag_anim_nar; static int dialog_num; ImageView kaki[]=new ImageView[24];//柿全部24こ 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 List<Integer> list_kaki24 = new ArrayList<>(); List<Integer> list_kaki_select = new ArrayList<>(); static int kaki_kazu;//サルがとる柿の数 int px;//サル画像の左側のマージン int kaki_num;//とる柿ナンバー(配列) float x;//とる柿のX座標 float y;//とる柿のy座標 //EditText dc_ma_editText; static TextView tuyosa; static TextView yasasisa; TextView ma_tv[]=new TextView[9];//TextView9こ 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}; String ma_tvNar0[]=new String[]{"わしといっしょに、","いやいや、きみがわしになって、","ぼうけんをしてくれるかのう?","むかし、","けがをしたさるをたすけたが、","そのご、どうなったのか、","きになっとる。","",""}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tuyosa=(TextView)findViewById(R.id.tuyosa); yasasisa=(TextView)findViewById(R.id.yasasisa); anim_nar = AnimationUtils.loadAnimation(this, R.anim.anim_nar); saru1 = findViewById(R.id.saru1); saru2 = findViewById(R.id.saru2); syokisettei(); } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); View view = findViewById(R.id.ma_app_screen); h = view.getHeight(); w = view.getWidth(); if (list_kaki_select.size() != 0) { kaki_getXY(); kaki_saru_keisan_animation(); start(); } } public void start(){ if(thread==null){ thread=new Thread(this); thread.start(); } } public void stop(){ if(thread!=null){ thread=null; } } public void run() { Thread thisThread=Thread.currentThread(); final Handler mainHandler = new Handler(Looper.getMainLooper()); while (thread!=null){ if(flag_count){count++;} if(flag_anim_nar==false&&flag_count_dialog){ count_dialog++; if(count_dialog==1){show_dialog();} } if(flag_syokisettei){syokisettei();} mainHandler.post(() -> { ma_tv[8].setVisibility(View.VISIBLE); 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); if(flag_anim_nar&&count>=6&&count%3==0&&count<=24){ ma_tv[(count/3)-2].setVisibility(View.VISIBLE); ma_tv[(count/3)-2].startAnimation(anim_nar); if(count==24){flag_anim_nar=false;} } }); try { thread.sleep(1000); } catch (InterruptedException e) { } } } public void show_dialog(){ dialog_num++; DialogFragment dialog = new MyDialogFragment(); dialog.show(getSupportFragmentManager(), "dialog_ma"); flag_count_dialog = false; count_dialog = 0; flag_count = false; } public void syokisettei(){ count = 0; count_dialog=0; flag_count=true; flag_count_dialog=false; flag_syokisettei=false; dialog_num=0; flag_anim_nar=true; 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]); } for(int i=0;i<24;i++){ kaki[i]=(ImageView)this.findViewById(kakiImageId[i]); list_kaki24.add(i); } kimeru_kaki();//どの柿をいくつとるか決めておく px = convertDPtoPX(100);//サル画像の左側のマージンが100dpをpxに変換 thread=null; } }

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

java

public class MyDialogFragment extends DialogFragment { LayoutInflater inflater; View view; static String name; static String messege; public Dialog onCreateDialog(Bundle savedInstanceState){ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); switch(dialog_num){ ・・・・・・・ case 3: builder.setMessage("きょうからわしは、「"+name+"じい」じゃ。よろしくたのむ! なまえをつけてくれたおれいに、やさしさポイント10ポイントをあげるよ。") //「はい」ボタンの設定 .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int point=10; int yasasisa_point=Integer.parseInt(yasasisa.getText().toString()); yasasisa.setText(String.valueOf(yasasisa_point+point)); flag_count = true; flag_count_dialog = true; } }); break; case 4: builder.setMessage("あ、そうじゃ。ことしは、かきがたくさんなった。そろそろたべたいが、さっきから、さるがうろちょろしとる。かきをとっていったんだろう。" ) //「はい」ボタンの設定 .setPositiveButton("つぎへ", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { flag_count = true; flag_count_dialog = true; } }); break; case 5: inflater=LayoutInflater.from(getActivity()); view=inflater.inflate(R.layout.dialog_custom_ma1,null); builder.setView(view) .setMessage("さあて、ここで、"+name+"じいからもんだいじゃ。かきはいくつとられた? これにこたえられないと、さきへはすすめないシステムじゃ。"); //「OK」ボタンの設定"" builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { flag_count = true; flag_count_dialog = true; EditText dc_ma1_editText=(EditText)view.findViewById(R.id.dc_ma1_editText); int kosuu=Integer.parseInt(dc_ma1_editText.getText().toString()); if(kosuu==kaki_kazu){ messege="よくみていたな。あっとるぞ。つぎへすすもう!"; }else{ messege="ちがっとる! これではさきにすすめん。さいしょからやりなおすか?"; } } }); break; case 6: if(messege=="よくみていたな。あっとるぞ。つぎへすすもう!") { builder.setMessage(messege) .setPositiveButton("つぎへ", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { flag_count = true; flag_count_dialog = true; } }); }else if(messege=="ちがっとる! これではさきにすすめん。さいしょからやりなおすか?"){ builder.setMessage(messege) .setPositiveButton("やりなおす", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { flag_syokisettei=true; } }) //「いいえ」ボタンの設定 .setNegativeButton("ゲームをおわる", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { flag_count_dialog = false; //ゲーム終了の処理 } }); } break; } return builder.create(); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Android Studio

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