●実現したいこと
fragment_numを正しく取得したい。
fragment_num=1のフラグメント表示画面で保存ダイアログを出してボタンを押す(DialogFragmentKyoutuu.javaに入る(関係する))とfragment_numが0になってしまうため、ゲーム保存がfragment_num=1でできないです。
以前は変数の多くをstaticで行っていて、その時はfragment_num=1のまま保存できていて、保存取り出しをすると、ちゃんとその画面を出すことができていましたが、できなくなってしまいました。ここのところ行ったことは、viewmodelを使用し、ここに多くの変数の出し入れをするように変更したことです。
●試したこと
プログラムの各所にfragment_numを表示するトーストを書き入れ、どこからfragment_numが0になるかを探しました。
・フラグメント画面表示onViewCreated・・・fragment_num=1
・フラグメント画面表示状態で、 ダイアログ表示のためのボタンタップをしダイアログを表示・・・fragment_num=1
・ダイアログのボタン4つ「ゲームに戻る」「保存しないで終了」「保存して終了」「保存してゲームに戻る」のどれをタップしても・・・fragment_num=0
なので、DialogFragmentKyoutuu.javaに入る(関係する)とfragment_num=0になってしまうと考えています。
お助けください。
MainViewModel.javaの中のfragment_num
java
1private int fragment_num; 2int getFragment_num(){return fragment_num;} 3void setFragment_num(int fragment_num){this.fragment_num=fragment_num;}
フラグメントのonCreate
java
1public class S1UranaiFragment extends Fragment implements Runnable,DialogFragmentKyoutuu.ResultReceiver { 2 3 //多いので省略 4 5 @Override 6 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 7 return inflater.inflate(R.layout.s1_fragment_uranai, container, false); 8 } 9 10 @Override 11 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 12 super.onViewCreated(view, savedInstanceState); 13 14 //「ほぞんしたところ」から来たなら 15 flag_from_hozon=mainViewModel.getFlag_from_hozon(); 16 if(flag_from_hozon) { 17 count_fr = mainViewModel.getCount_fr(); 18 flag_from_hozon = false; 19 mainViewModel.setFlag_from_hozon(flag_from_hozon); 20 }else {//stage1から来たなら 21 count_fr=0; 22 } 23 fragment_num=1; 24 mainViewModel.setFragment_num(fragment_num); 25 aitemu_fr = (TextView) view.findViewById(R.id.aitemu_fr); 26 TitleActivity.point_set(); 27 thread=null; 28 29 //省略 30 31 start(); 32 33 ObjectAnimator animator_toumei = ObjectAnimator.ofFloat(uranaisi, "alpha", 0f, 0f).setDuration(3000); 34 batu_fr=view.findViewById(R.id.batu_fr); 35 batu_fr.setOnClickListener(new View.OnClickListener() { 36 @Override 37 public void onClick(View v) { 38 if(flag_batu_fr) {//保存ダイアログ表示 39 flag_count_fr=false; 40 DialogFragment dialog = new DialogFragmentKyoutuu(); 41 dialog_num_kyoutuu = 1; 42 mainViewModel.setDialog_num_kyoutuu(dialog_num_kyoutuu); 43 dialog.show(getParentFragmentManager(), "dialog_kyoutuu"+dialog_num_kyoutuu); 44 } 45 } 46 });
DialogFragmentKyoutuu.java
java
1public class DialogFragmentKyoutuu extends DialogFragment { 2 //多いので省略 3 LayoutInflater inflater; 4 View view; 5 static boolean hozon_on 6 Context context; 7 SharedPreferences sharedPreferences; 8 9 public Dialog onCreateDialog(Bundle savedInstanceState){ 10 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 11 sharedPreferences = context.getSharedPreferences("Data", Context.MODE_PRIVATE); 12 13 dialog_num_kyoutuu=mainViewModel.getDialog_num_kyoutuu(); 14 flag_count=false; 15 mainViewModel.setFlag_count(flag_count); 16 ResultReceiver resultReceiver = (ResultReceiver) getActivity(); 17 resultReceiver.onReturnValue(0,flag_count,0,0);//flagnum(0:flag_count(fragmentではflag_count_fr) 1:flag_from_dialog 2:) 18 flag_count_fr=false; 19 mainViewModel.setFlag_count_fr(flag_count_fr); 20 switch(dialog_num_kyoutuu){ 21 case 0://省略 22 break; 23 case 1:inflater=LayoutInflater.from(getActivity());//保存画面ダイアログ 24 view=inflater.inflate(R.layout.dialog_custom_kyoutuu_put_hozon,null); 25 TextView hozon_tv=view.findViewById(R.id.hozon_tv); 26 hozon_tv.setText(hozon_messege); 27 builder.setView(view); 28 Button hozon_bt_cansel=view.findViewById(R.id.hozon_bt_cansel); 29 hozon_bt_cansel.setOnClickListener(new View.OnClickListener() {//ゲームに戻るボタン 30 @Override 31 public void onClick(View v) { 32 set_flag_count_true();//アクティビティのflag_count,フラグメントのflag_count_frをtrueにする 33 dismiss(); 34 } 35 }); 36 Button hozon_bt_syuuryou=view.findViewById(R.id.hozon_bt_syuuryou); 37 hozon_bt_syuuryou.setOnClickListener(new View.OnClickListener() {//保存しないで終了ボタン 38 @Override 39 public void onClick(View v) { 40 hozon_on=false; 41 dialog_num_kyoutuu=2; 42 mainViewModel.setDialog_num_kyoutuu(dialog_num_kyoutuu); 43 DialogFragment dialog = new DialogFragmentKyoutuu();//終了していいか確認画面ダイアログ 44 dialog.show(getParentFragmentManager(), "dialog_kyoutuu"+dialog_num_kyoutuu); 45 } 46 }); 47 Button hozon_bt_hozongosyuuryou=view.findViewById(R.id.hozon_bt_hozonngosyuuryou); 48 hozon_bt_hozongosyuuryou.setOnClickListener(new View.OnClickListener() {//保存して終了ボタン 49 @Override 50 public void onClick(View v) { 51 put_hozon();//保存 52 hozon_on=true; 53 dialog_num_kyoutuu=2; 54 mainViewModel.setDialog_num_kyoutuu(dialog_num_kyoutuu); 55 DialogFragment dialog = new DialogFragmentKyoutuu();//終了していいか確認画面 56 dialog.show(getParentFragmentManager(), "dialog_kyoutuu"+dialog_num_kyoutuu); 57 } 58 }); 59 Button hozon_bt_hozongomodoru=view.findViewById(R.id.hozon_bt_hozonngomodoru); 60 hozon_bt_hozongomodoru.setOnClickListener(new View.OnClickListener() {//保存してゲームに戻るボタン 61 @Override 62 public void onClick(View v) { 63 put_hozon();//まず保存 64 hozon_on=true; 65 set_flag_count_true();//アクティビティのflag_count,flag_count_frをtrueにする dismiss(); 66 } 67 }); 68 if(getActivity().getLocalClassName().equals("MainActivity")){//MainActivityでは2つのボタンを非表示 69 hozon_bt_hozongomodoru.setVisibility(View.INVISIBLE); 70 hozon_bt_hozongosyuuryou.setVisibility(View.INVISIBLE); 71 } 72 break; 73 case 2://保存ありなしの終了確認ダイアログ 74 break; 75 case 3://開始保存取り出しダイアログ 76 break; 77 default: 78 throw new IllegalStateException("Unexpected value: " + dialog_num_kyoutuu); 79 } 80 AlertDialog dialog = builder.create(); 81 dialog.setCanceledOnTouchOutside(false);//ダイアログ以外の画面をタップしてもダイアログは消えない 82 return dialog; 83 } 84 void change_activity(){ 85 stage_num=mainViewModel.getStage_num(); 86 fragment_num=mainViewModel.getFragment_num(); 87 flag_to_stage=mainViewModel.getFlag_to_stage(); 88 Intent intent = new Intent(getActivity(), ChangeActivity.class); 89 mainViewModel.setFlag_game_finish(flag_game_finish); 90 mainViewModel.setStage_num(stage_num); 91 startActivity(intent); 92 getActivity().finish(); 93 } 94 //アクティビティ、フラグメント両用 95 void put_hozon(){ 96 sharedPreferences = context.getSharedPreferences("Data", Context.MODE_PRIVATE); 97 SharedPreferences.Editor editor = sharedPreferences.edit(); 98 stage_num=mainViewModel.getStage_num(); 99 switch (stage_num){ 100 case 1://Stage1 101 Stage1 stage1=(Stage1)getActivity(); 102 stage1.stage1_set_originalData();//originalDataをviewmodelに入れるメソッド 103 104 editor.putInt("Count",mainViewModel.getCount()); 105 editor.putBoolean("Flag_count",flag_count); 106 editor.putInt("Step",mainViewModel.getStep()); 107 //フラグメントのみの値 108 editor.putInt("Count_fr", mainViewModel.getCount_fr()); 109 fragment_num=mainViewModel.getFragment_num(); 110 switch (fragment_num) { 111 case 0:break;//フラグメントなし 112 case 1: //uranainoyakataのみの値 113 editor.putBoolean("Flag_uranau",mainViewModel.getFlag_uranau()); 114 break; 115 case 2: 116 } 117 case 2://Stage2 118 break; 119 } 120 //共通のデータをviewmodelからsharedpreferencesに保存 121 editor.putString("Aitemu", mainViewModel.getAitemu()); 122 editor.putInt("Stage_num",mainViewModel.getStage_num()); 123 editor.putInt("Fragment_num",mainViewModel.getFragment_num()); 124 editor.apply();//SharedPreferencesに保存 125 } 126 void get_hozon(){ 127 //省略 128 } 129 @Override 130 public void onAttach(Context context) {//アクティビティと関連づいたとき 131 super.onAttach(context); 132 this.context = context; 133 } 134 135 public interface ResultReceiver { 136 void onReturnValue(int flagnum,Boolean flag,int num0,int num1); 137 } 138}
回答1件
あなたの回答
tips
プレビュー