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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

2回答

3768閲覧

ダイアログの繰り返し表示について

misaka

総合スコア31

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

1クリップ

投稿2018/01/17 02:41

Xamarin.Androidでアプリを開発中にアラートダイアログを繰り返し表示させるプログラムを作成しているのですが、for文などで回しても表示されることがなく処理されてしまい手詰まっています。
なにかいい方法・推奨される方法はありますでしょうか。下記の処理を3度行うプログラムです。ダイアログのコードも載せておきます。よろしくお願いします。

C#

1         //テキストボックス部分 2 var layout_out = new LinearLayout(this) { Orientation = Orientation.Vertical }; 3 layout_out.SetGravity(GravityFlags.Left); 4 var input_ans = new EditText(this); 5 input_ans.InputType = Android.Text.InputTypes.ClassNumber; 6 layout_out.AddView(new TextView(this){ Text = "3個中"+Answers+"個目", TextSize = 30 }); 7 layout_out.AddView(new TextView(this) { Text = formula, TextSize=30 }); 8 layout_out.AddView(input_ans); 9 10 11 var dig = new AlertDialog.Builder(this); 12 dig.SetTitle("値を入力して下さい"); 13 dig.SetView(layout_out); 14 dig.SetPositiveButton("OK", (s, a) => 15 { 16 //省略 17         }); 18 dig.Create().Show();

----処理----
0. 値を入力
0. OKボタンを押したら値を比較

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

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

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

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

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

guest

回答2

0

Dialog.Show はブロッキング処理ではないので for や while で単純に繰り返しはできません。
次のように、DialogBox の表示〜結果を得るまでを Task 化してあげると、 C# の async/await 構文で繰り返しできるようになります。

csharp

1using Android.App; 2using Android.Widget; 3using Android.OS; 4using System.Threading.Tasks; 5 6namespace DialogBoxSample 7{ 8 [Activity(Label = "DialogBoxSample", MainLauncher = true, Icon = "@mipmap/icon")] 9 public class MainActivity : Activity 10 { 11 protected override void OnCreate(Bundle savedInstanceState) 12 { 13 base.OnCreate(savedInstanceState); 14 15 // Set our view from the "main" layout resource 16 SetContentView(Resource.Layout.Main); 17 18 Button button = FindViewById<Button>(Resource.Id.myButton); 19 20 button.Click += async (_, __) => 21 { 22 int index = 1; 23 while (await ShowDialogAsync(index)) 24 { 25 index++; 26 } 27 28 Toast.MakeText(this, $"{index}回くりかえしました", ToastLength.Short).Show(); 29 }; 30 } 31 32 private Task<bool> ShowDialogAsync(int index) 33 { 34 var source = new TaskCompletionSource<bool>(); 35 36 var builder = new AlertDialog.Builder(this); 37 builder.SetTitle($"くりかえしますか?({index}回目)") 38 .SetPositiveButton("はい", (_, __) => source.SetResult(true)) 39 .SetNegativeButton("いいえ", (_, __) => source.SetResult(false)) 40 .Show(); 41 42 return source.Task; 43 } 44 } 45}

ただし、 Dialog.show() は直接呼ぶとメモリリークすることが知られているので、使用しない方がよいでしょう。

投稿2018/01/17 03:19

amay077

総合スコア1075

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

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

misaka

2018/01/18 01:42

回答ありがとうございます。 丁寧にコードも載せていただきありがとうございました。 参考にして構築したところうまく動作いたしました。 感謝致しますm(_ _)m
guest

0

ベストアンサー

for文で繰り返すことはできません。
繰り返しのタイミング次第ですが、OKボタンを押した時に再度表示する処理を行う必要があります。

投稿2018/01/17 02:57

yona

総合スコア18155

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

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

misaka

2018/01/17 03:00

回答ありがとうございます ということは、 dig.SetPositiveButton("OK", (s, a) => { //省略}); この中に記述するということですよね? 繰り返しのタイミングとしては値を入力し、OKボタンを押したときに再度入力画面を再度表示する形です。
yona

2018/01/17 03:17

入力値を検査して、値によって再入力させるということですね? それなら、上記のタイミングで問題ありません。
misaka

2018/01/17 03:21

そうです! この中に for(; Answers < 3;) {dig.Create().Show();} のような処理でよいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問