●実現したいこと
下のようなメソッドがすべてのアクティビティ、フラグメントに設定してあり、アクティビティ→アクティビテイ、フラグメント→アクティビティでは頻繁に使っています。アクティビティorフラグメント→フラグメントに値を送るときにも使用したいのですが、実際、どのようにコードを書いたらいいのか分からないので、教えていただきたいです。
よろしくお願いします。
java
1public void onReturnValue(int fragment,int flagnum,Boolean flag,int num0,int num1) { 2//処理 3}
●アクティビティorフラグメント→アクティビティで使用するときは、下のように使っています。
java
1 2MainActivity mainActivity = (MainActivity) getActivity(); 3mainActivity.onReturnValue(0,0,flag_count,0,0);
●現在行っていること
フラグメントを表示
→フラグメント上にアイテムダイアログを表示
→アイテムダイアログの「アイテムをつかう」ボタンをタップ→flag_aitemu_tukau=true; mainviewmodel.setFlag_aitemu_tukau(flag_aitemu_tukau);
→フラグメントのスレッドのrunの中で、if(flag_aitemu_tukau){//処理}
(フラグメントでは常時スレッドが動いています)
のように行っています。
ただし、多分ですがボタンを押したタイミングによって、正しく処理ができたり、処理がなされなかったりするので、直接onReturnvalueで値を送り処理を行えたらと思います。
onReturnvalueで値を送っても、値を受け取るタイミングで処理ができたりできなかったりするのでしょうか。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
※コメントにより、趣旨が変わってしまいますが回答がごちゃごちゃになりそうですので書き直します。
例えば、会話風にダイアログを表示するとしますと、こんな感じに出来ます。
"NEXT" をクリックしなくても一定時間(4秒)で自動で進む "AUTOモード" を付けてみました。
ダイアログ左下の "AUTO-ON" / "AUTO-OFF" で切り替えられます。
MainActivity.java
java
1import android.os.Bundle; 2import android.util.Log; 3 4import androidx.appcompat.app.AppCompatActivity; 5import androidx.fragment.app.FragmentManager; 6 7public class MainActivity extends AppCompatActivity { 8 private static final String conversation[] = { 9 "A:休みの日にどこか行きたいんですが、いいところありますか?", 10 "B:うーん、A さんはスポーツが好き?", 11 "A:はい。", 12 "B:××スポーツセンターとかはどう?", 13 "A:スポーツセンター?", 14 "B:建物は古いけど、安くていいよ。", 15 "A:へー。" 16 }; 17 private static String REQUEST_KEY = "Conversation"; 18 private static String DIALOG_TAG = "Dialog"; 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.activity_main); 24 25 FragmentManager fm = getSupportFragmentManager(); 26 27 fm.setFragmentResultListener(REQUEST_KEY, this, (requestKey, result) -> { 28 int index = result.getInt(ConversationFragment.RESULT_NEXT_INDEX); 29 if(index < conversation.length) { 30 boolean automode = result.getBoolean(ConversationFragment.RESULT_AUTOMODE); 31 ConversationFragment dialog = ConversationFragment.createInstance(REQUEST_KEY, conversation[index], index, conversation.length, automode); 32 dialog.show(fm, DIALOG_TAG); 33 return; 34 } 35 36 //会話が終わったらここに実行が来るので、終わった時の処理はここに書く 37 Log.d("MainActivity", "会話終了"); 38 }); 39 40 if(fm.findFragmentByTag(DIALOG_TAG) == null) { 41 ConversationFragment dialog = ConversationFragment.createInstance(REQUEST_KEY, conversation[0], 0, conversation.length); 42 dialog.show(fm, DIALOG_TAG); 43 } 44 } 45}
ConversationFragment.java
java
1import android.app.Dialog; 2import android.content.DialogInterface; 3import android.os.*; 4import android.view.View; 5 6import androidx.annotation.*; 7import androidx.appcompat.app.AlertDialog; 8import androidx.fragment.app.DialogFragment; 9 10public class ConversationFragment extends DialogFragment { 11 private static final String ARGS_REQUEST_KEY = "requestKey"; 12 private static final String ARGS_MESSAGE = "message"; 13 private static final String ARGS_INDEX = "index"; 14 private static final String ARGS_END_OF_INDEX = "endOfIndex"; 15 private static final String ARGS_AUTOMODE = "automode"; 16 17 private static final int AUTOMODE_DELAY = 4000; //[ms] 18 19 public static final String RESULT_NEXT_INDEX = "nextIndex"; 20 public static final String RESULT_AUTOMODE = "automode"; 21 22 @NonNull 23 static ConversationFragment createInstance(@NonNull String requestKey, @NonNull String message, int index, int endOfIndex) { 24 return createInstance(requestKey, message, index, endOfIndex, false); 25 } 26 @NonNull 27 static ConversationFragment createInstance(@NonNull String requestKey, @NonNull String message, int index, int endOfIndex, boolean automode) { 28 ConversationFragment fragment = new ConversationFragment(); 29 Bundle args = new Bundle(); 30 args.putString(ARGS_REQUEST_KEY, requestKey); 31 args.putString(ARGS_MESSAGE, message); 32 args.putInt(ARGS_INDEX, index); 33 args.putInt(ARGS_END_OF_INDEX, endOfIndex); 34 args.putBoolean(ARGS_AUTOMODE, automode); 35 fragment.setArguments(args); 36 return fragment; 37 } 38 39 @NonNull 40 @Override 41 public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { 42 Bundle args = getArguments(); 43 String message = args.getString(ARGS_MESSAGE); 44 int index = args.getInt(ARGS_INDEX); 45 int endOfIndex = args.getInt(ARGS_END_OF_INDEX); 46 47 AlertDialog dialog = new AlertDialog.Builder(getContext()) 48 .setMessage(message) 49 .setPositiveButton(index+1<endOfIndex ? "Next" : "End", (d, w) -> setFragmentResult(args, index+1, false)) 50 .setNegativeButton("Skip", (d, w) -> setFragmentResult(args, endOfIndex, false)) 51 .setNeutralButton("-", null) //NEUTRALボタンを生成するためのダミー 52 .create(); 53 54 dialog.setOnShowListener(new AutomodeManager(args)); 55 56 return dialog; 57 } 58 59 private class AutomodeManager implements DialogInterface.OnShowListener, View.OnClickListener { 60 private AlertDialog dialog; 61 private Bundle args; 62 private boolean automode; 63 private Handler handler; 64 private Runnable callback; 65 66 AutomodeManager(@NonNull Bundle args) { 67 this.args = args; 68 automode = args.getBoolean(ARGS_AUTOMODE); 69 handler = new Handler(requireActivity().getMainLooper()); 70 } 71 72 @Override 73 public void onShow(DialogInterface dialog) { 74 this.dialog = (AlertDialog)dialog; 75 this.dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(this); //押してもダイアログがクローズしないように, 直接リスナを登録 76 setButtonsState(); 77 if(automode) postClickEvent(); 78 } 79 80 @Override 81 public void onClick(View view) { 82 automode = !automode; 83 setButtonsState(); 84 if(automode) { 85 postClickEvent(); 86 } else { 87 cancelClickEvent(); 88 } 89 } 90 91 private void setButtonsState() { 92 dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(!automode); 93 dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(!automode); 94 dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setText(automode ? "Auto-OFF" : "Auto-ON"); 95 } 96 97 private void postClickEvent() { 98 callback = () -> { 99 setFragmentResult(args, args.getInt(ARGS_INDEX)+1, true); 100 dialog.dismiss(); 101 }; 102 handler.postDelayed(callback, AUTOMODE_DELAY); //[ms] 103 } 104 105 private void cancelClickEvent() { 106 handler.removeCallbacks(callback); 107 } 108 } 109 110 private void setFragmentResult(@NonNull Bundle args, int nextIndex, boolean automode) { 111 String requestKey = args.getString(ARGS_REQUEST_KEY); 112 Bundle result = new Bundle(); 113 result.putInt(RESULT_NEXT_INDEX, nextIndex); 114 result.putBoolean(RESULT_AUTOMODE, automode); 115 getParentFragmentManager().setFragmentResult(requestKey, result); 116 } 117}
投稿2022/03/26 06:18
編集2022/04/14 11:58総合スコア12648
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/27 08:32
2022/03/27 13:23
2022/04/12 10:13
2022/04/12 11:50 編集
2022/04/13 10:25
2022/04/13 11:28
2022/04/14 22:18