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

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

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

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

Android Studio

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

Q&A

解決済

1回答

820閲覧

fragment_num=1のフラグメント表示画面で、ダイアログを表示するとfragment_num=0となってしまう

aruko

総合スコア47

Java

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

Android Studio

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

0グッド

0クリップ

投稿2022/02/21 08:47

●実現したいこと
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}

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

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

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

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

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

PlugOut777

2022/02/21 10:27 編集

省略された中にあるのだと思いますが、S1UranaiFragmentとDialogFragmentKyoutuu でmainViewModelはどのように定義されていますか? > 以前は変数の多くをstaticで行っていて、その時はfragment_num=1のまま保存できていて、保存取り出しをすると、ちゃんとその画面を出すことができていましたが、できなくなってしまいました。 これが原因の可能性が高いです。
aruko

2022/02/21 10:51

PlugOut777さん、ありがとうございます。 mainViewModelは、TitleActivityというアクティビティで下のように宣言し、S1UranaiFragmentとDialogFragmentKyoutuuではそれをインポートして使っています。 static MainVieModel mainVieModel; mainViewModel=new ViewModelProvider(this).get(MainViewModel.class); 今の状態ではfragment_numだけがうまくいかず、stage_numや他の変数はすべて正しく取得できているのです。 なので、一番疑ったのは、MainVieModelの中で、fragment_numだけ二重に設定していないか、また書き込みミスをしていないかでしたが、そうなっていません。 アドバイスしていただければありがたいです。
aruko

2022/02/21 10:53

static MainViewModel mainViewModelです。スペルミスですみません。
PlugOut777

2022/02/21 11:46

> 今の状態ではfragment_numだけがうまくいかず、stage_numや他の変数はすべて正しく取得できているのです。 少し気になったのですが、fragment_numはDialogFragmentKyoutuuの中にフィールドとして定義されているのですかね? また、値が0になってしまうのはput_hozon()の処理の中でしょうか?
aruko

2022/02/21 12:09

fragment_numは、どのアクティビティ、フラグメントでも保存関係で使いますが、それぞれの場所で、int fragment_num;で宣言しています。 ですので、使用するときにfragment_num=mainViewModel.getFragment();をしてから使用しているつもりです。 DialigFragmentKyoutuuのどこかで、初期値のfragment_numのまま使えば0になるのは当然なので、どこかでそのようにしていないかも探したつもりです。 put_hozon()は、保存ダイアログの「保存して終了」「保存してゲームに戻る」には関係していますが、「ゲームに戻る」「保存しないで終了」には関係していません。 「ゲームに戻る」のボタンタップでもfragment_num=0になってしまうので、put_hozonが原因ではないように思います。 原因探しの質問ですみません。 アドバイスいただければ嬉しいです。
jimbe

2022/02/21 12:57

直接は関係無いと思いますが、 > 以前は変数の多くをstaticで行っていて、(中略) ここのところ行ったことは、viewmodelを使用し、ここに多くの変数の出し入れをするように変更したことです。 > static MainViewModel mainViewModel > mainViewModel=new ViewModelProvider(this).get(MainViewModel.class); > それをインポートして使っています。 static 変数を ViewModel に入れても、 ViewModel を static にしてしまっては意味がありません。 ViewModel は ViewModelProvider によって管理されることが前提ですので、必要に応じて ViewModelProvider から取得して使用するべきと思います。 ( getActivity が動作すれば mainViewModel=new ViewModelProvider(getActivity()).get(MainViewModel.class) で取り出せるはずです。 )
jimbe

2022/02/21 13:46

> fragment_num=1のフラグメント表示画面 というのが S1UranaiFragment クラスのことでしょうか。そして fragment_num=1; mainViewModel.setFragment_num(fragment_num); でビューモデルの fragment_num を 1 にしていると。 (なぜわざわざ 一度変数に入れているのか分かりませんが。) > 保存ダイアログを出してボタンを押す は(コードと逆のようで) batu_fr がボタンで、押すと dialog_num_kyoutuu = 1; mainViewModel.setDialog_num_kyoutuu(dialog_num_kyoutuu); で mainViewModel.dialog_num_kyoutuu = 1 になって DialogFragmentKyoutuu の onCreateDialog で dialog_num_kyoutuu=mainViewModel.getDialog_num_kyoutuu(); から switch(dialog_num_kyoutuu) で case 1 (//保存画面ダイアログ) に入り > ダイアログのボタン4つ「ゲームに戻る」「保存しないで終了」「保存して終了」「保存してゲームに戻る」 の 4 つのボタンの設定があると・・・。 (なぜこのように複雑になってしまっているのでしょう。 dialog_num_kyoutuu は DialogFragmentKyoutuu のパラメータ (Fragment なのでコンストラクタは使えませんが ) にすれば良いだけでは。) > ダイアログのボタン4つ「ゲームに戻る」「保存しないで終了」「保存して終了」「保存してゲームに戻る」のどれをタップしても・・・fragment_num=0 というのは、ご提示のコードのどの部分でトースト表示したでしょうか。
jimbe

2022/02/21 13:51

MainViewModel の setFragment_num メソッドで、パラメータに 0 が指定されたら Log.i("MainViewModel", "fragment_num is ZERO", new Throwable()); を実行するようにしてみるのは如何でしょうか。 このログでスタックトレースが出ますので、どこから 0 に設定するように呼ばれているかが分かると思います。
aruko

2022/02/21 14:00

jimbeさん、ViewModelについての使い方を教えてくださり、ありがとうございます。 変えてみます。 PlugOut777さん、「ゲームに戻る」ボタンの、set_flag_count_trueメソッドの内容を載せます。(コードが長すぎて投稿できなかったので省略しました) void set_flag_count_true(){ flag_from_dialog_hozon=true; mainViewModel.setFlag_from_dialog_hozon(flag_from_dialog_hozon); fragment_num=mainViewModel.getFragment_num(); if(fragment_num==0) { flag_count = true; ResultReceiver resultReceiver = (ResultReceiver) getActivity(); resultReceiver.onReturnValue(0,flag_count,0,0);//flagnum(0:flag_count(fragmentではflag_count_fr) 1:flag_from_dialog 2:) }//フラグメントのflag_count_fr=trueの設定をここでしたい else { flag_count_fr = true; mainViewModel.setFlag_count_fr(flag_count_fr); } }
aruko

2022/02/21 22:58

jimbeさん、ありがとうございます。 まず、MainViewModel mainViewModel;のstaticをはずしたいのですが、宣言してあるTitleActivityに、point_set(),point_get(int,int,int)という2つのstaticメソッドがあり、その中で、mainViewModel.getFragment_num()を使っているので、staticをはずせないということでした。 これは、パラメータにfragment_numを入れればできそうなので、やってみます。 また、 >dialog_num_kyoutuu は DialogFragmentKyoutuu のパラメータ (Fragment なのでコンストラクタは使えませんが ) にすれば良いだけでは。) DialogFragment dialog = new DialogFragmentKyoutuu();の()のところにパラメータが入るように設定すればよいということでしょうか。 >Log.i("MainViewModel", "fragment_num is ZERO", new Throwable()); やってみます。 ・フラグメント表示画面・・・S1UranaiFragment  ・「保存ダイアログ表示ボタン」・・・batu_fr ・すべてのアクティビティ、フラグメントから使用するダイアログがまとめてある・・・DialogFragmentKyoutuu  ・「ゲームに戻るボタン」・・・hozon_bt_cansel
PlugOut777

2022/02/22 00:04

うーん、個人的には各ボタンのsetOnClickListener()の中でnew DialogFragmentKyoutuu()しているあたりが怪しいような気はしますが……。 見落とし確認をするための情報が足りないような気もするので もし可能であれば以下の情報も補完して頂いた方が、他の方からもっとヒントを貰えるかもしれません。 - mainViewModelの変数の定義 - fragment_numの変数の定義 - トーストを仕込んだ箇所
jimbe

2022/02/22 09:31

> 宣言してあるTitleActivityに、point_set(),point_get(int,int,int)という2つのstaticメソッドがあり、その中で、mainViewModel.getFragment_num()を使っているので、staticをはずせないということでした。 > これは、パラメータにfragment_numを入れればできそうなので、やってみます。 以前変数につきましては static の是非のお尋ねがあったと思いますが、メソッドの static もこのように影響が波及してしまうと面倒になりますので、 point_set(), point_get(int,int,int) の static を外すというのも機会(?)が有りましたらお考えになっては如何でしょう。 > DialogFragment dialog = new DialogFragmentKyoutuu();の()のところにパラメータが入るように設定すればよいということでしょうか。 フラグメントはコンストラクタに直接パラメータを書いても、再生成時はパラメータの無いコンストラクタが使用されて誤動作の原因になりますので、コンストラクタでパラメータを指定するのはしないほうが良いです。 フラグメントの生成時にパラメータを使用するには、専用のメソッドが有ります。 [Fragmentで、パラメータ付きの画面遷移を実装する] https://tech.mokelab.com/android/Fragment/argument.html
aruko

2022/02/25 22:34

ネットが繋がらない、パソコン買い換えず等々で、遅くなり申し訳ありません。 1 MainViewModelをstaticにしないという件  staticをなしにしてみましたが、それぞれのアクティビティ、フラグメントでnewされるためか、値が受け継がれずエラーが出ました。 最初は各アクティビティで宣言していましたが、なぜstaticに変えたのかの理由を忘れていましたが、そうでした。なので今は、とりあえずstaticに戻しましたが、またやり方を考えてみます。 2 DialogFragmentKyoutuuにパラメータをつける件 パラメータのあるインスタンスを作り、うまくいきました。 が、誤動作の原因になる、と教えてくださったのでこれも考えます。 3 mainViewModelを不必要に使い、複雑にしている件  viewmodelを初めて使ったので、心配でその都度その都度set,getを繰り返していたので、すべて見直し、現アクティビティ(フラグメント)から出るとき以外はset,getを行わないこと、パラメータで値が引き継げるものはパラメータに変えることを行ったら、fragment_numも正しく取得できるようになりました。 fragment_num=0になってしまう原因は、多分ですが、提示したコード以外で省略した部分にありました。 買い替え前のパソコンで正しく保存、保存取り出しができている状態になりました。 PlugOut777さん、jimbeさん、一緒に考えて下さり本当にありがとうございました。 ところが、また別の問題が発生したので、新たに質問を立てたいと思います。
jimbe

2022/02/26 04:17

> ネットが繋がらない、パソコン買い換え リアルなイベントが重なってしまったようで、お疲れ様です(x_x > fragment_numも正しく取得できるようになりました。 > fragment_num=0になってしまう原因は、多分ですが、提示したコード以外で省略した部分にありました。 変数を static やフィールド等にして"どこからでも使える"ようにした場合に一番問題になるのがまさにこのようなことです。 (人が一度に把握できる・していられる範囲は案外狭いのです。) 過去のシステム(を作るプログラマ)はそれによって大変苦労した為に、逆に変数が使える範囲(="スコープ")を極力小さくして不用意に(知らないうちにとか、過去に作って忘れたとかで)変更できないようにし、"変数の変化を想定内に収める"ことが出来るようにする手法を考えました。 それが「カプセル化」等と呼ばれ、"{" "}" の中で宣言した変数はその外に出たら無くなる(=その前後で変数がどうだったかを気にする必要が無くなる)レベルから、一連の関係データとその操作メソッドを1クラスに纏めて外部からは直接データを変更出来なくする(データの整合性をそのクラスだけで取れるようになる)、特定の情報を表示するビューのセットはフラグメント化して表示の整合性を取る等、さまざまなレベルで内外を分けるようになりました。 "変数の値を使いたい時にわざわざ get~ とか set ~ とか面倒なことしないでも static とか付ければいつでも使えるから便利" と思われがちですが、それは "包丁を使いたい時にいつでも使えるように机の上に出して置く" ような、もしくはそれ以上にプログラマ的には「実は危ない」行為となっています。 扱うデータをグループ化し、そのグループ単位でどのような操作があってどう変化し、いつ必要で不要になるかを見極めてカプセル化する必要があります。
aruko

2022/02/26 05:34

こういう話をしてくださること、私がもっている本には書いてないことなので、ほんとに有難いです。 まだ全体の15%くらいの進捗状況ですが、基本的な部分をきちっと固めれば、あとはそれと同じように作ればいいので、今行っていることをしっかり考えてきちんと作っていきたいと思います。 ありがとうございました。 感謝です。^_^
guest

回答1

0

自己解決

PlugOutさん、jimbeさんのアドバイスにより解決しました。

投稿2022/02/25 22:35

aruko

総合スコア47

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

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

aruko

2022/02/27 10:28

本当に申し訳ありません。 そして、とても嬉しいです。 最新android sutudioで動作できるようになり、まだ残して使っているstatic変数、メソッドを無くせるものは無くすよう、これから取り掛かろうと思ったところです。 パラメータのあるインスタンスをなくしたら、できるようになりました。 しかし、なんといってもお手本がないため、自分なりのコードです。 今後また根本的な部分でつまづくところが出てくるかもしれないと思いつつ・・なので、お手本として使わせてもらいます。 ありがとうございます。 お手本に
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問