前提
アクティビティ→フラグメント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
試したこと
ソースコード中の ////を表示させて、どこの処理に入ることができているかを見た。