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

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

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

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

Android

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

Xamarin

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

Q&A

解決済

1回答

910閲覧

XamarinによるAndroidアプリ、OnBackPressedがReleaseビルドだと呼び出されない

Seiten_Minagawa

総合スコア58

C#

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

Android

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

Xamarin

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

0グッド

0クリップ

投稿2017/09/01 10:15

編集2017/09/04 08:56

###前提・実現したいこと
XamarinとC#を使ったAndroidアプリ。
1つのActivityのみを持つアプリで、バックボタンを押した際に一度確認のダイアログを出し、そこで終了するという選択をしてはじめてアプリが終了されるようにしたい。

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

Releaseビルド時にオーバーライドしたOnBackPressedが正常に呼び出されず、ダイアログが表示されないまま終了してしまう。 Debugビルド時には正常に呼び出され、ダイアログが表示される。 ダイアログの挙動は問題なし。 エラーメッセージはない。 全て実機におけるテストの結果。

###事象の発生しているコード

MainActivity.cs

using Android.App; using Android.Widget; using Android.OS; using Android.Content; namespace App1 { [Activity(Label = "Score", MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)] public class MainActivity : Activity { (中略) public override void OnBackPressed() { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.SetTitle("Terminate Check"); alert.SetMessage("Really?"); alert.SetNegativeButton("No", (sender, args) => { }); alert.SetPositiveButton("Yes", (sender, args) => { Finish(); }); alert.Show(); } protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView (Resource.Layout.Main); (中略) } } }

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio Community 2017、Xamarin、C#を使用。
テストに使用した端末はXperia XZ、Androidのバージョンは7.0。
(追加:Nexus 9(Androidのバージョンは5.0)でも同様の現象が発生。)

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

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

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

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

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

amay077

2017/09/01 12:14

事象の発生しているコードを提示された方が良いかと思います。
Seiten_Minagawa

2017/09/02 16:06

関係がありそうな部分のみ提示しました。一部のコードについてはお見せできないことをご容赦ください。
guest

回答1

0

ベストアンサー

この事象はとても個人的には興味深いので是非 Xamarin.Android でなく通常の Java-Android でも再現するのか、ご確認いただきたいです。

私は Xamarin.Android で、 OnBackPressedalert.show() をする方法を手持ちの Vaio Phone A(Android 6.0)で試してみましたが、Release ビルドでも正常に動作するようです。

関係なさそうな気もしますが、Android での Dialog の表示は、 Dialog.show() を直接呼び出さずに、 Activity.onCreateDialog を override し、 showDialog() を呼び出す方法が推奨されていました(今は公式ドキュメントにも DialogFragment を使用する方法しか載っていませんが)。

それによれば、コードは次のように書き直せると思います。
元々が再現しないので、これで解決できるかは分かりませんが、何かの参考になれば幸いです。

private readonly int DIALOG_CONFIRM_EXIT_ID = 999; // 値は任意 protected override Dialog OnCreateDialog(int id, Bundle bundle) { if (id == DIALOG_CONFIRM_EXIT_ID) { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.SetTitle("Terminate Check"); alert.SetMessage("Really?"); alert.SetNegativeButton("No", (sender, args) => { }); alert.SetPositiveButton("Yes", (sender, args) => { Finish(); }); return alert.Create(); } else { return base.OnCreateDialog(id, bundle); } } public override void OnBackPressed() { ShowDialog(DIALOG_CONFIRM_EXIT_ID); }

また、「BACKキーを押してActivityを閉じる前に確認する」を実現する方法としては、 onKeyUpdispatchKeyEvent を override する方法があります。もしかしたら onBackPressed の代替になるかも知れません。

投稿2017/09/03 12:12

amay077

総合スコア1075

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

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

Seiten_Minagawa

2017/09/04 09:04 編集

ご提示いただいた方法を試してみましたが、同様にReleaseビルドでのみダイアログが表示されないまま終了しました。 (そもそものOnCreateDialogがdeprecatedのようでした) 「開発者によるインストルメンテーションを有効にする」にチェックを入れてReleaseビルドしようとすると「logcatに接続できず、GetProcessIdが返されました:0」というエラーが出てテストできません。 そのため、ReleaseビルドでOnBackPressedが呼び出されているかは確認できません。 amay077さんはプロパティ設定をどのように設定してテストしましたか? 追加情報として、Nexus 9(Androidバージョンは5.0)でも同様にReleaseビルドで終了確認のダイアログが出ないまま終了しました。
amay077

2017/09/05 02:49

やはり Java-Android で試された方がよいと思いますね。ほとんど同じコードと環境で、Java で再現せず Xamarin.Android で再現するなら Xamarin.Android のバグという可能性もあります。
Seiten_Minagawa

2017/09/14 08:54

dispatchKeyEventを使用する方法で試してみたところ、無事にReleaseビルドでも確認のメッセージが表示されるようになりました! OnBackPressedがReleaseビルドだとうまくいかないのは謎のままですが、ひとまずやりたいことは解決しましたのでこの回答をベストアンサーとさせていただきます。 Java-AndroidのOnBackPressedでもReleaseビルドだと呼び出されないかどうかは、私はJavaを未習得のため今後Java-Androidを習得する機会があった際に試してみることにします。
Seiten_Minagawa

2017/09/14 09:11

追記:dispatchKeyEventで「Back」を拾うとダイアログが出る方法ですと、二重にダイアログが出てきてしまうようです。 「Releaseビルドで確認のダイアログを出す」という問題は解決されましたので、別の質問として投稿しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問