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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Android

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

Xamarin

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

Q&A

解決済

1回答

1351閲覧

[Xamarin.Android] AlertDialogを閉じるメソッドが見当たらない

PeerGynt

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Android

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

Xamarin

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

0グッド

0クリップ

投稿2023/01/24 06:41

またもやお世話になります。Androidアプリ開発の初心者です。
Microsoft Learn等のサイトを参考に、見様見真似で販売管理ツールを組んでいます。

単にダイアログ画面を表示させ、ユーザーが情報を入力したらそれを閉じたい、というだけの処理が上手くいかず、半ベソかいています。
要するに適切なプログラミング入門書も無く、4時間ほどネット上を探し回るも情報が見当たりません。

恐れ入りますが、どなたかやり方を教えて下さい。

■やりたいこと

例えば条件入力等のダイアログ画面を、Activity側から開いたり閉じたりしたい。

ユーザーが「条件入力」ボタンを押せば、Activity側でメソッドを叩いて「条件入力用のダイアログ」画面を開く。
逆にダイアログ画面側の「実行」ボタンが押されれば、Activity側でメソッドを叩いてダイアログ画面を閉じたい(たったそれだけ)

■開発環境等

Xamarin.Androidプロジェクト
最小Android 9.0(API28) ~ ターゲットAndroid 11.0(API30)
Win11 Pro + Visual Studio 2019(開発環境)

■試してみたこと

Microsoft Learn含む幾つかのサイトを参照し、Dialog Fragmentを使用したダイアログ画面作成を実装……しようとしたら、「旧形式だ」とVisual Studioに警告される。
調べてみると、なるほど何世代か前(Android.App)のやり方だと判明。
なので新たな(代替)やり方を探すも、Web上に見当たらず。

結局、AlertDialogを使用して自作ダイアログ画面を表示できると知り、そちらを実装しました。
そして画面表示自体は、.Create().Show() メソッドで問題なく上手くいきました。
またダイアログ画面からの、(ユーザー入力)値の受け渡しも問題なく上手くいきました。

ところが、ダイアログ画面を閉じるメソッドが見つかりません。4時間探し回ったものの結局わからないままです。

Android Studio/Java だと .dismiss() でOK、という記述を見つけたのですが、Xamarin/Android の場合はそういうメソッドが存在しませんでした。
.Create().Dismiss() はありましたが、実行しても変化なし(ダイアログ画面は閉じられません)

Android Studio/Java ならば .hide() というメソッドがあるそうで、そちらも調べてみたのですが、やはりXamarinには同一のメソッドがありません。
.Dispose() があったので試してみたのですが、ダイアログ画面は閉じられませんでした。

さらに調べてみたところ、
「AlertDialogを継承して、隠蔽されたDisMissメソッドを表に出す」
という方法を見つけたので実装してみたのですが、変化なし。
もしかすると、私がDismissメソッド及びDismissEventを誤解している可能性もありますが……。

C#

1 - AlertDialogを継承し、隠蔽されたDismissを公開 2 3public class CustomDialog : AlertDialog 4 { 5 public CustomDialog(Context context) : base(context) { } 6 7 //イベント定義 8 public event DismisEventDelegate DismisEvent; 9 public delegate void DismisEventDelegate(object sender, EventArgs e); 10 11 //Dismissイベントをオーバーライドしてイベントとして公開する 12 public override void Dismiss() 13 { 14 base.Dismiss(); 15 if (DismisEvent != null) 16 { 17 DismisEvent(this, null); 18 } 19 } 20 }

C#

1 - ダイアログ画面の定義 2 3private void SetDialog() 4 { 5 _inflater = LayoutInflater.From(this); 6 View _view = _inflater.Inflate(Resource.Layout.dialog_Search, null); 7 8 _dialog = new CustomDialog.Builder(this); 9 10 Button _btnInitialA = _view.FindViewById<Button>(Resource.Id.btnInitialA); 11 _btnInitialA.Click += btnInitial_Click; 12 13 _dialog.SetTitle("得意先検索"); 14 _dialog.SetPositiveButton("キャンセル", (sender, args) => { }); 15 _dialog.SetView(_view); 16 17 _dialog.Create(); 18 }

■教えて頂きたいこと

というわけで、AlertDialogをActivity側から表示した後、同じくActivity側で閉じる方法を教えて下さい。

もしくはDialog Fragmentを、Xamarin に実装するやり方でも構いません。
ただしAndroid.AppのFragmentを継承して実装する方法(こちらはWeb上でも見かける)は、前述の通り古過ぎてダメだそうです。新たな実装方法があれば、ご教示頂けるとありがたいです。

以上よろしくお願い致します。

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

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

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

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

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

jimbe

2023/01/24 15:00 編集

Dispose() はあるでしょうか? dismiss を探すと↓ドキュメントらしきものが当たりましたが… https://learn.microsoft.com/ja-jp/dotnet/api/android.app.dialog.dismiss?view=xamarin-android-sdk-13&viewFallbackFrom=xamarin-android-sdk-9 >Dialog Fragmentを、Xamarin に実装するやり方 サポートライブラリの DialogFragment が廃止されたことへの対応であれば、 AndroidX 版の DialogFragment を使うのが良いのではないでしょうか。 Xamarin を使用した AndroidX https://learn.microsoft.com/ja-jp/xamarin/android/platform/androidx
guest

回答1

0

自己解決

>jimbeさん

ご教示ありがとうございます。いつも大変助かっており、本当に感謝しております。

AlertDialog路線は、昨晩さんざん弄り回して結局わからなかったので、元に戻ってDialog Fragmentの方向で頑張ってみました。
お陰様で、jimbeさんご教示の通り、AndroidXでのDialog Fragment表示に成功しました。

結論としては、Visual Studio2019でXamarin.Androidプロジェクトを新規作成すると、デフォルト設定でAndroid.App依存となります。
結局そこが問題の出発点のようで……。

■解決策

幾つか書籍をひろげたりWebサイトを探し回っただけでは、根本的な理解が不足していました。
jimbeさんのご指摘をとっかかりに調べまくり、やっとAndroid.App、Support v4、AndroidX等の意味が(少しだけ)判明。

即ちAndroid.Appに依存して開発に着手していましたが、現行ではAndroidX.AppCompat.Appで着手すべきらしい……と理解(まだ自信なし)

(1)
そこでまず、NuGetパッケージ「AndroidX.AppCompat」を追加。
各Activityクラス先頭に「using AndroidX.AppCompat.App;」を追加。かつActivityクラス継承元を「Activity → AppCompatActivity」に変更。
これで基本的に、AncroidX依存へ転換。

(2)
次にDialog Fragmentの処置ですが、こちらも参照をAndroid.AppからAndroidX.Fragment.Appに変更するだけでした。

(3)
そしてダイアログ表示処理ですが、FragmentManagerについて全く理解出来ず、手こずりました。が、海外のQAサイトで記述を見つけ、一応判明。

(4)
ダイアログ側のユーザー入力値は、入力がなされた時点で通知イベントを発生させ、Activity側でそれを受け取りダイアログのプロパティから入力値を取得する……という方法で取り敢えず解決しました。

(5)
最後にダイアログ画面を閉じるメソッドですが、Dismiss()ですんなり上手くいきました。

C#

1 private void BtnCondition_Click(object sender, EventArgs e) 2 { 3 _dialog = new SearchDialog(); 4 5 // ユーザーのアクションを感知するイベント 6 _dialog.SetValue += new EventHandler(this.GetDialogValue); 7 // ダイアログ表示 8 _dialog.Show(this.SupportFragmentManager, string.Empty); 9 } 10 11 /// <summary> 12 /// フリガナ検索ダイアログ側のアクション検知 13 /// </summary> 14 /// <param name="sender"></param> 15 /// <param name="e"></param> 16 private void GetDialogValue(object sender, EventArgs e) 17 { 18 switch(_dialog.Action) 19 { 20 case SearchDialog.DivAction.Kana: 21 Console.WriteLine("フリガナ検索: " + _dialog.Value); 22 break; 23 case SearchDialog.DivAction.Initial: 24 Console.WriteLine("頭文字検索: " + _dialog.Value); 25 break; 26 default: 27 break; 28 } 29 30 _dialog.Dismiss(); 31 } 32コード

■課題

ダイアログ画面が一応表示されるようになりましたが、ただしWindows等のように画面表示がホールドされません。
つまり背面のActivity側をタップすると、ダイアログ画面が消えてしまいます。

今回はそれで問題ないので、このままでいきたいと思います。

投稿2023/01/25 12:52

PeerGynt

総合スコア8

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

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

jimbe

2023/01/25 14:20

Android はシングルスレッドですので、モーダル/モードレスという考え方はありません。 ダイアログ外を押したらキャンセル扱いにする/しないという設定によって、モーダル的になります。
PeerGynt

2023/01/25 14:37

>jimbeさん なるほど了解です。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問