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

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

ただいまの
回答率

88.92%

Xamarin.Androidでダイアログが意図していないタイミングで表示される

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 105

mt.O-kun

score 1

前提・実現したいこと

環境:Xamarin.Android

ダイアログを表示して確認を行い、その後選択肢に応じた処理を行わせたい。

発生している問題・エラーメッセージ

dialog.Show()が実行されたタイミングでダイアログが生成されず、tryの中のif文が必ずfalseになり処理が進まない。
具体的にはelseのreturnが実行された後にダイアログが表示される。

該当のソースコード

C#
MainActivity : AppCompatActivity , ITextWatcher
{
  ....
  public AfterTextChanged (IEditable s)
  {
   .....

     else if (etLoc_new.Length() == 12)  
            {
                ConfirmDialog dialog = new ConfirmDialog(this, etLoc_new.Text);
                try
                {
                    if (dialog.Choise()) //ダイアログでの選択によって戻り値が変化
                    {
                        StockMovement movement = new StockMovement(etLoc_old.Text, etProCode.Text,
                                      Int32.Parse(etQuant.Text), etLoc_new.Text);

                        if (movement.IsSuccess())
                        {
                            dialog.Confirm(this);
                            FormClear();
                        }
                        else 
                        {
                            this.Finish();
                        }
                    }
                    else
                    {
                        return;
                    }
                }
....
ダイアログ表示用クラス

public class ConfirmDialog : DialogFragment //,IDialogInterfaceOnClickListener
    {
        bool flg;
        public AlertDialog.Builder builder;
        public ConfirmDialog(Context context, string loc)
        {
            builder = new AlertDialog.Builder(context);
            var dialog = builder.Create();

            builder.SetTitle("確認")
                   .SetMessage("在庫移動を確定します。")
                   .SetPositiveButton("はい", (s,e) =>{ flgChange(true); dialog.Dismiss(); })
                   .SetNegativeButton("いいえ", (s,e) => { flgChange(false); dialog.Dismiss(); });

            dialog.Show();

            void flgChange(bool f)
            {
                flg = f;
            }
        }

        public bool Choise()
        {
            return flg;
        }

ダイアログの選択肢によってflgの値が変動、その後Choise()の戻り値でtrueを得て
別の処理へ移行できると想定しておりました。
ダイアログの生成に関して何かルールがあり、そのせいでうまくいっていないのなら申し訳ありません。
海外の情報等も見てみましたが見つけられませんでした。

試したこと

別スレッドで処理をさせたり、呼び出し元からShow()を呼んでみたりしました。
Activityの問題なのかなとも思ってます。

補足情報(FW/ツールのバージョンなど)

初めての質問のため情報が足りない部分もあるかもしれないです。
何か必要なことがあればお申し付けください。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

dialog.Show()しても、そこで処理が止まるわけではないので、すぐにdialog.Choise()が実行されるのは当然の結果です。ダイアログが閉じられた後に処理を行うのであれば、コールバックを設定するなり、Taskにするなりして、処理を待つようにしなければいけません。また、DialogFragmentにするのであれば、ダイアログの作成は、OnCreateDialogで行います。
以下に例を示します。

public class ConfirmDialog : DialogFragment
{
    private readonly TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();

    public override Android.App.Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        var builder = new AlertDialog.Builder(Activity);

        builder.SetTitle("確認")
                .SetMessage("在庫移動を確定します。")
                .SetPositiveButton("はい", (s, e) => { tcs.TrySetResult(true); })
                .SetNegativeButton("いいえ", (s, e) => { tcs.TrySetResult(false); });

        return builder.Create();
    }

    public Task<bool> Choise()
    {
        return tcs.Task;
    }
}
MainActivity : AppCompatActivity , ITextWatcher
{
  ....
  public async void AfterTextChanged (IEditable s)
  {
   .....

     else if (etLoc_new.Length() == 12)  
            {
                ConfirmDialog dialog = new ConfirmDialog();
                dialog.Show(SupportFragmentManager, "dialog")
                try
                {
                    if (await dialog.Choise()) //ダイアログでの選択によって戻り値が変化
                    {
                    }
                }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/11 18:17

    早速のご回答ありがとうございます。
    ご教授いただいた”Task<>”で処理を待つ方法で意図したとおりの動きにすることができました。
    わかりやすく丁寧な回答ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る