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

前提

アクティビティ→フラグメント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で受け取られています。

エラーメッセージ

該当のソースコード

java

public void run() { Thread thisThread=Thread.currentThread(); while (thread!=null) { mainHandler.post(() -> { if (mainViewModel.getFlag_from_dialog_kyoutuu()==true) { count_fr = count_fr - 1; flag_count_fr = true; flag_from_dialog_kyoutuu = false; mainViewModel.setFlag_from_dialog_kyoutuu(flag_from_dialog_kyoutuu); ////no = 2 if (flag_count_fr) { ////no = -no; if (mainViewModel.getFlag_aitemu_tukau()==true) { ////no = no * 10 + 3; point_get(-1, 0, 0); animator_tenmetu.setTarget(s1_kyoudai_aitemu); animator_tenmetu.start(); if (mainViewModel.getAitemu_num() == 2) {//使ったアイテムがカギならば if (kagi_rock == 2) { s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); s1_kyoudai_tv1.setText("1つカギがあいた!"); kagi_rock = 1; mainViewModel.setKagi_rock(kagi_rock); count_fr = 6; flag_count_fr = false; kyoudaikeika = 1; mainViewModel.setKyoudaikeika(kyoudaikeika); ////no = no * 10 + 4; } else if (kagi_rock == 1) { s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); s1_kyoudai_kagi1.setImageResource(R.drawable.kagi_open); s1_kyoudai_tv1.setText("2つともカギがあいた!"); kagi_rock = 0; mainViewModel.setKagi_rock(kagi_rock); flag_count_fr = true; count_fr = 6; kyoudaikeika = 2; mainViewModel.setKyoudaikeika(kyoudaikeika); ////no = no * 10 + 5; } } flag_aitemu_tukau = false; mainViewModel.setFlag_aitemu_tukau(flag_aitemu_tukau); } else { if (count_fr <= 7) { if (count_fr == 1) { s1_kyoudai_hukidasi1.setVisibility(View.VISIBLE); s1_kyoudai_tv1.setText("カギがかかっておる。しかもダブルロック‼"); } else if (count_fr == 4) { s1_kyoudai_tv1.setText(""); } else if (count_fr == 5) { if (kagi_rock == 2) { s1_kyoudai_tv1.setText("げんじゅうじゃのう。"); ////no=no*10+6; flag_count_fr = false; } else if (kagi_rock == 1) { if (mainViewModel.getKyoudaikeika() == 1) { s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); s1_kyoudai_tv1.setText("1つあいた! まえあけたからか! あと1つカギがいるな。"); } else { s1_kyoudai_tv1.setText("あと1つカギがいるな。"); } flag_count_fr = false; } else if (kagi_rock == 0) { s1_kyoudai_kagi0.setImageResource(R.drawable.kagi_open); s1_kyoudai_kagi1.setImageResource(R.drawable.kagi_open); s1_kyoudai_tv1.setText("あ、あいた! まえあけたからか!"); count_fr = 6; } } } } if (kagi_rock == 0) { //・・・いろいろな処理 } count_fr++; } }); try { thread.sleep(1000); } catch (InterruptedException e) { } } }

試したこと

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

コメントを投稿

0 コメント