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

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

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

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

Android Studio

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

Q&A

解決済

1回答

717閲覧

フラグメントのonReturnvalueを、アクティビティやフラグメントから実行したい

aruko

総合スコア47

Java

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

Android Studio

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

0グッド

0クリップ

投稿2022/03/24 23:43

編集2022/03/27 08:29

●実現したいこと
下のようなメソッドがすべてのアクティビティ、フラグメントに設定してあり、アクティビティ→アクティビテイ、フラグメント→アクティビティでは頻繁に使っています。アクティビティ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ページで確認できます。

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

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

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

guest

回答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
jimbe

総合スコア12648

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

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

aruko

2022/03/27 08:32

コードの例まで書いてくださってありがとうございます。 質問の説明不足だったので、質問を書き直しました。 ほんとに、いつもありがとうございます。
jimbe

2022/03/27 13:23

> →フラグメントのスレッドのrunの中で、if(flag_aitemu_tukau){//処理} >(フラグメントでは常時スレッドが動いています) この「フラグメントで常時動作しているスレッド」は何をしているのでしょうか。 変数のやりとり云々よりも、そのスレッドの存在が問題を複雑にしている感じがします。 マルチスレッドのプログラミングは『何時何が起こるか分からないモノ』同士のタイミングを合わせるという非常に難しい部類で、出来れば使わないほうが良いです。 ( Android アプリ自体シングルタスクで動作しているくらいですから。)
aruko

2022/04/12 10:13

”できるだけ使わない方がいいもの”なんですね。 キャラクターどうしが次々会話するようにしています。 そういった場合、皆さんはどうのような方法で会話文を出しているのか、もし教えていただけるとありがたいです。 自分はマルチスレッドという方法しか考えられなかったので・・・ 色々な方法を知りたいです。
jimbe

2022/04/12 11:50 編集

会話の表示の為にマルチスレッドというのは "朝食の目玉焼き1つを作るのにシェフ5人で…" みたいなイメージです。 Android はイベントによって処理を行っていきます。その代表が「ボタンを押した」というイベントですね。 画面の表示を「ボタンを押した」によって変化させていくのであれば、例えば配列 "会話" にやり取りを入れておき、その配列のインデックスをボタンを押したら +1 していくことで次々に配列を順に表示させることが出来るのではないでしょうか。 具体的なトコロは画面構成等で全く異なると思いますし、定型があるものとも思えませんので、回答を書き替えてテキトウな構造で作って見ます。
aruko

2022/04/13 10:25

>会話の表示の為にマルチスレッドというのは "朝食の目玉焼き1つを作るのにシェフ5人で…" みたいなイメージです。 面白い具体的なイメージですが、この意味が分かるようになるまでまだまだかかりますが、そういうことなんですね。 それはよくないよ、だけではなく、例まで作って下さって感謝です。 マルチスレッドだと自動的にどんどん会話が進みますが、スマホアプリの特性?androidstudioの特性?からすると、ボタンタップで会話を進めることがよいことだと教えていただき、ありがとうございました。
jimbe

2022/04/13 11:28

余りゲームをするほうではありませんが、ゲームでキャラのやりとりを表示する場合、読む人が自分の読むスピードに合わせて読んでいけるようにセリフ毎に「次へ」とか「push any key」みたいにするのではないでしょうか。 また、『何度もクリックするのが面倒』な場合用に自動で進めるモードもあるでしょう。 もしその "自動で進めるモード" を作るとすれば、メッセージを表示後に数秒経ってから「次へ」ボタンが自動で押されるように、 Handler をセッティングすれば良いように思います。
aruko

2022/04/14 22:18

またまたすみません。 自動に会話が出てくるものを作っていると書いたので、そこまで考えてくださったのですね。 そうです。会話を読むスピードもありますが、いちいちボタンを押さなくていいよう自動に出てくる会話にしようと思ったのでそうしています。 オートモードというのがあるのですね。 ありがとうございます。 最終的にどの方法でいくかの選択肢ができました。 ほんとうにいつもありがとうございます。 質問の内容が変わってきたので、一旦ここで区切ります。 この内容で質問し直す場合、またよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問