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

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

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

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

Android Studio

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

Q&A

1回答

610閲覧

フラグメントがダイアログフラグメントの値を受け取らない

aruko

総合スコア47

Java

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

Android Studio

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

0グッド

0クリップ

投稿2022/12/09 07:23

編集2022/12/09 08:04

前提

アクティビティ→フラグメント1、フラグメント2、フラグメント3、フラグメント4、フラグメント5

を作成し、保存のためやアイテムを使うためのダイアログフラグメントをどのフラグメントからも表示することができるようにしてあり、うまくいっていました。
フラグメントは、アクティビィ← →フラグメント のように、アクティビティを通して表示できます。

発生している問題・エラーメッセージ

ところが、下の場合のみ、ダイアログフラグメントの値が受け取れないことが分かりました。

★アクティビティ→フラグメント5→アクティビティ→フラグメント3 
の順番で表示させていくと、フラグメント3表示中に、ダイアログフラグメントの値を受け取ることができません。いろんな場合を試してみましたが、★以外はすべて正しくできます。
また下のようなランタイムエラーが出ることもありました。
java.lang.IllegalStateException: Fragment Fragment5{c848634} (a858190e-9808-4020-b77a-d77c82837581) not attached to a context.
また20回に1回くらいできるときがあります。クリックするタイミングかもしれません。
なので、フラグメント5に原因がありそうなことは分かりました。フラグメント5には、Bitmapがあります。それ以外は作成上の違いはありません。

実現したいこと

ダイアログフラグメントからの値
・flag_from_dialog_fragment=true
・flag_aitemu_tukau=true
の2つの値を正しく受け取りたい

フラグメント3表示中、ダイアログフラグメントを出し、クリックした時にトースト表示をしていますが、その時点では値は正しくtrueで送られていますが、フラグメント3にその値がfalseで受け取られています。

エラーメッセージ

fragment3(受け取る側)

java

1public void run() { 2 Thread thisThread=Thread.currentThread(); 3 while (thread!=null) { 4 mainHandler.post(() -> { 5 if (mainViewModel.getFlag_from_dialog_kyoutuu()==true) { 6 count_fr = count_fr - 1; 7 flag_count_fr = true; 8 flag_from_dialog_kyoutuu = false; 9 mainViewModel.setFlag_from_dialog_kyoutuu(flag_from_dialog_kyoutuu); 10 ////no = 2 11 if (flag_count_fr) { 12 ////no = -no; 13 if (mainViewModel.getFlag_aitemu_tukau()==true) { 14 ////no = no * 10 + 3; 15 point_get(-1, 0, 0); 16 animator_tenmetu.setTarget(s1_kyoudai_aitemu); 17 animator_tenmetu.start(); 18 if (mainViewModel.getAitemu_num() == 2) {//使ったアイテムがカギならば 19 if (kagi_rock == 2) { 20 s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); 21 s1_kyoudai_tv1.setText("1つカギがあいた!"); 22 kagi_rock = 1; 23 mainViewModel.setKagi_rock(kagi_rock); 24 count_fr = 6; 25 flag_count_fr = false; 26 kyoudaikeika = 1; 27 mainViewModel.setKyoudaikeika(kyoudaikeika); 28 ////no = no * 10 + 4; 29 } else if (kagi_rock == 1) { 30 s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); 31 s1_kyoudai_kagi1.setImageResource(R.drawable.kagi_open); 32 s1_kyoudai_tv1.setText("2つともカギがあいた!"); 33 kagi_rock = 0; 34 mainViewModel.setKagi_rock(kagi_rock); 35 flag_count_fr = true; 36 count_fr = 6; 37 kyoudaikeika = 2; 38 mainViewModel.setKyoudaikeika(kyoudaikeika); 39 ////no = no * 10 + 5; 40 } 41 } 42 flag_aitemu_tukau = false; 43 mainViewModel.setFlag_aitemu_tukau(flag_aitemu_tukau); 44 } else { 45 if (count_fr <= 7) { 46 if (count_fr == 1) { 47 s1_kyoudai_hukidasi1.setVisibility(View.VISIBLE); 48 s1_kyoudai_tv1.setText("カギがかかっておる。しかもダブルロック‼"); 49 } else if (count_fr == 4) { 50 s1_kyoudai_tv1.setText(""); 51 } else if (count_fr == 5) { 52 if (kagi_rock == 2) { 53 s1_kyoudai_tv1.setText("げんじゅうじゃのう。"); 54 ////no=no*10+6; 55 flag_count_fr = false; 56 } else if (kagi_rock == 1) { 57 if (mainViewModel.getKyoudaikeika() == 1) { 58 s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); 59 s1_kyoudai_tv1.setText("1つあいた! まえあけたからか! あと1つカギがいるな。"); 60 } else { 61 s1_kyoudai_tv1.setText("あと1つカギがいるな。"); 62 } 63 flag_count_fr = false; 64 } else if (kagi_rock == 0) { 65 s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); 66 s1_kyoudai_kagi1.setImageResource(R.drawable.kagi_open); 67 s1_kyoudai_tv1.setText("あ、あいた! まえあけたからか!"); 68 count_fr = 6; 69 } 70 } 71 } 72 } 73 if (kagi_rock == 0) { 74 75 //・・・いろいろな処理 76 } 77 count_fr++; 78 } 79 }); 80 try { 81 thread.sleep(1000); 82 } catch (InterruptedException e) { 83 } 84 } 85 }

fragment5(問題だと思われるフラグメントの一部分)

java

1void jii_jinjanihairu() { 2 if ((count_fr < 5 && count_fr_moto % 5 == 0)||(count_fr>=5&&count_fr<9)){ 3 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.jii_l_usiro); 4 if (migihidari) { 5 s1_jinja_jii_hajime.setImageResource(R.drawable.jii_l_usiro2); 6 bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.jii_l_usiro2); 7 migihidari = false; 8 } else { 9 s1_jinja_jii_hajime.setImageResource(R.drawable.jii_l_usiro); 10 migihidari = true; 11 } 12 if(count_fr>=5&&count_fr<=8){ 13 //画像をmatrixで縮小させる 14 int imageWidth = bitmap.getWidth(); 15 int imageHeight = bitmap.getHeight(); 16 // Matrix インスタンス生成 17 Matrix matrix = new Matrix(); 18 float ratio = 1.0f; 19 ratio = ratio - 0.05f * (count_fr_moto - 25);//縮小サイズ 20 // resize 21 matrix.preScale(ratio, ratio); 22 Bitmap bitmap_sakusei = Bitmap.createBitmap(bitmap, 0, 0, imageWidth, imageHeight, matrix, true); 23 // drawableに変換 24 Drawable drawable = new BitmapDrawable(getResources(), bitmap_sakusei); 25 s1_jinja_jii_hajime.setImageDrawable(drawable); 26 } 27 s1_jinja_jii_hajime.setY(s1_jinja_jii_hajime.getY()-28.0f); 28 } 29 } 30

試したこと

ソースコード中の ////を表示させて、どこの処理に入ることができているかを見た。

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

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

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

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

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

hoshi-takanori

2022/12/09 07:43

そのソースコードが呼び出してるメソッドとかの処理内容が分からないのでなんとも言えませんが、そもそも自分でスレッド作ってる時点で、あまり良くないような…。
aruko

2022/12/09 07:57

会話形式に進めるゲームなので、スレッドを動かすことで会話を進め、その途中にアイテムを使用したいとき、ダイアログフラグメントを表示させて「つかう」をクリックして、flag_from_dialog_fragment=tureとflag_aitemu_tukau=trueの値をフラグメントに送るという形式です。スレッドで会話を進めるやり方がよくないということは以前指摘を受けましたが、もうかなり作っている段階なので、今回はこのままのやり方で進めようと思っていますが、変えた方がいいでしょうか。またどのようなやり方が適しているのでしょうか。教えていただきたいです。
jimbe

2022/12/09 09:09 編集

どんどんインデントが深くなっていっているいるのを見ただけで。問題がある状態であることが分かります。 プログラムを作り始めの頃は、「あれをやってからこれをやってこうなったらこれをこうして・・・」というのをひたすらコード化してしまうので、if の連続で階層が深くなっていくものです。 全体として何を基準に動作するのか、例えば、ユーザの選択→場面変更を繰り返すループをメインとし、会話の進行状態を示すカウンタや何処に行ったことかあるかのフラグ等を用意してそれぞれの場面でやったことを記録して、場面変更はそれらによって変わっていくようにすれば、フラグ等は増えても、プログラム自体は複雑にはなり難いと思います。個々場面の状況判断を個々の if の塊でするのではなく、必要な分だけ自由度を保ちながらどこまで一般化して簡潔に書くことが出来るかがプログラマの腕の見せ所かもしれません。 まぁ、この辺はプログラミングというよりはゲームシステム設計な感じもありますけども。 使ったことはありませんが "RPG ツクール" みたいなツールがどうやっているのかを調べたりしてみては如何でしょうか。
aruko

2022/12/09 12:56

hoshi-takanoriさん、jimbeさん、ありがとうございます。久しぶりにゲーム作り復活で、忘れていることを思い出しながら行っています。久しぶりだったので、どこでどのようなふるまいをしたら〇〇が現れる・・・など、以前は頭の中とプログラムの中で表していたものを、トリガーをはっきりさせ、フラグメントの図式化をして作り始めました。 「必要な分だけ自由度を保ちながらどこまで一般化して簡潔に書くことが出来るか」 「"RPG ツクール" みたいなツールがどうやっているのかを調べたりしてみては如何でしょうか。」 はい、調べてみます。またアドバイスいただけることがあればよろしくお願いします。
jimbe

2022/12/09 16:05

>久しぶりにゲーム作り復活で、忘れていることを思い出しながら行っています あるあるですね^^;;; 「あの時は何考えてたっけ」「コレ何だっけ」と『明日の自分は自分では無い』という言葉が身に染みる時です。 あえて続きで作ろうとせずなら、過去は基準・教訓・参考・資料として今ならどう書けるかを(苦しみながらも)楽しめると思います。 がんばってみてください。
guest

回答1

0

個々のコードが何をしているのかよく分かりませんが、メインスレッドに post した処理内で何やら長々とやっているのが気になります。
メインスレッドはアプリや Android のあらゆる処理を順番に行っており、ポストした処理が実行中は他のあらゆる処理が停止します。
もしポストした処理の中で何かを待つようなことをしていたら、それは永遠に終わりません。(デッドロックと言います)
メインスレッドへポストする処理は最小限の極短い処理に留める必要があります。

投稿2022/12/11 05:28

編集2022/12/11 05:28
jimbe

総合スコア12648

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問