【Unity】Androidでチェックボックス付きのアラートダイアログ(AlertDialog)を使う 
2017/11/17 Fri [edit]
ついでなので、以前に作ったYes/No ダイアログ、OK ダイアログをカスタマイズして、チェックボックス付きのダイアログも作ってみた。大したものではないが、良く利用されるダイアログなので、まぁ、あっても良いかと(笑)。
今回も Androidの基本機能を利用するプラグインのアップデート版となる。追加内容・仕様変更などはなるべく更新履歴に書くようにしているが、基本的にはそのまま使えるようにしているので、旧バージョンがある場合は上書きでも構わないと思う。プラグイン自体のセットアップは以前の記事を参照して欲しい。自分で作りたい場合は簡略化したものだが、今回も元の Java コードを書いておくので挑戦してみるのも良いだろう(※Java コードは解説用に一部抜粋・省略したものであって、そのままコピペでは使えないことに注意)。
|
パッケージに同梱されているサンプルでは、シーン「Assets/_Test/Scenes/DialogTest」にまとまっているので、適当に複製などして自由に使って欲しい。
(※) Unity 5.6.3p1 / AndroidStudio 2.3.3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認
■チェックボックス付き Yes/No ダイアログを使う

●Unity から Android のチェックボックス付き Yes/No ダイアログを使う C# コード
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowDialogWithCheckBox(title, message, checkBoxText, checkBoxTextColor, defaultChecked,
callbackGameObject, callbackMethod, yesCaption, yesValue, noCaption, noValue, style);
#endif
●プラグイン内の対応する Java コード
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.widget.CheckBox;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
switch(which) {
case DialogInterface.BUTTON_POSITIVE:
UnitySendMessage(callbackGameObject, callbackMethod,
yesValue + ", CHECKED_" + String.valueOf(checkBox.isChecked()).toUpperCase());
break;
case DialogInterface.BUTTON_NEGATIVE:
UnitySendMessage(callbackGameObject, callbackMethod,
noValue + ", CHECKED_" + String.valueOf(checkBox.isChecked()).toUpperCase());
break;
}
}
};
final CheckBox checkBox = new CheckBox(context);
checkBox.setChecked(defaultChecked);
if (checkBoxTextColor != 0)
checkBox.setTextColor(checkBoxTextColor);
checkBox.setText(checkBoxText);
AlertDialog.Builder builder = new AlertDialog.Builder(context, styleId);
builder.setTitle(title)
.setMessage(message)
.setView(checkBox)
.setPositiveButton(yesCaption, listener)
.setNegativeButton(noCaption, listener)
.show();
これは以前に作ったYes/No ダイアログにチェックボックスを追加しただけのものなので内容的にはほとんど変わらない。違いはチェックボックスの状態がオンのとき ", CHECKED_TRUE"が、オフのとき ", CHECKED_FALSE"(カンマと1文字の空白(", ")+文字列定数)が、「Yes」ボタンの戻り値(yesValue)または「No」ボタンの戻り値(noValue)に結合されて、ヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。また、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない。
戻り値のチェック状態の判定は C# コードでは、
if (message.Contains("CHECKED_TRUE")) {
//チェックボックスがオンのときの処理
}
のように調べると良いだろう。実際問題、Java(プラグイン)から Unity へデータを送信するには UnitySendMessage() というものを使っているが、これは文字列型を1つしか渡せないので、本来ならパラメタを JSON や URLエンコードした方が良いのかも知れない。しかしパラメタが少ないのなら、受信側でのデコード処理と値取り出しでコードが冗長となることを考えて、文字列定数のような形式にすることにした。汎用性はあまりないが、yesValue や noValue を適切に設定すれば、特に問題は出ないハズなので、その辺りの仕様は大目に見て欲しい。
また、チェックボックスのテキスト色に関しては、プラグインは Java で作ってあるため int 型の ARGB 形式になっているが、少し不便に感じたので、Unity の Color 形式のオーバーロードも作っておいた。あと少し特殊な仕様として色のパラメタ(ここでは checkBoxTextColor)に int値で 0 (= Color.clear)を与えた場合「指定なし」となるようにしてある(本来なら 0 は無色透明になるが、テキスト色には必要ないため)。ダイアログのスタイルの引数(ここでは style)を当てることもやってみたが、上手く反映されないようなので、個別に設定するようにした次第だ。指定するのが面倒なときはとりあえず 0 にしておけば良い(通常は黒になると思う)。また、int 型の ARGB 形式と Unity の Color 形式の相互変換は「Assets/FantomLib/Scripts/Graphics/XColor.cs」にまとめておいたので、自由に使って貰っても構わない。
ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。
(参考)R.style.theme
サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestDialogYesNo()」「OnReceiveChecked()」あたりを見て欲しい。
■チェックボックス付き OK ダイアログを使う

●Unity から Android のチェックボックス付き OK ダイアログを使う C# コード
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowDialogWithCheckBox(title, message, checkBoxText, checkBoxTextColor, defaultChecked,
callbackGameObject, callbackMethod, okCaption, resultValue, style);
#endif
●プラグイン内の対応する Java コード
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.widget.CheckBox;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;
DialogInterface.OnDismissListener listener = new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
UnitySendMessage(callbackGameObject, callbackMethod,
resultValue + ", CHECKED_" + String.valueOf(checkBox.isChecked()).toUpperCase());
}
};
final CheckBox checkBox = new CheckBox(context);
checkBox.setChecked(defaultChecked);
if (checkBoxTextColor != 0)
checkBox.setTextColor(checkBoxTextColor);
checkBox.setText(checkBoxText);
AlertDialog.Builder builder = new AlertDialog.Builder(context, styleId);
builder.setTitle(title)
.setMessage(message)
.setView(checkBox)
.setPositiveButton(okCcaption, null)
.setOnDismissListener(listener)
.show();
これも以前に作ったOK ダイアログにチェックボックスを追加しただけのものなので内容的にはほとんど変わらない。違いはチェックボックスの状態がオンのとき ", CHECKED_TRUE"が、オフのとき ", CHECKED_FALSE"(カンマと1文字の空白(", ")+文字列定数)が、「OK」ボタンの戻り値(okValue)に結合されて、ヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。また、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない。
戻り値のチェック状態の判定は C# コードでは、
if (message.Contains("CHECKED_TRUE")) {
//チェックボックスがオンのときの処理
}
のように調べると良いだろう。実際問題、Java(プラグイン)から Unity へデータを送信するには UnitySendMessage() というものを使っているが、これは文字列型を1つしか渡せないので、本来ならパラメタを JSON や URLエンコードした方が良いのかも知れない。しかしパラメタが少ないのなら、受信側でのデコード処理と値取り出しでコードが冗長となることを考えて、文字列定数のような形式にすることにした。汎用性はあまりないが、resultValue を適切に設定すれば、特に問題は出ないハズなので、その辺りの仕様は大目に見て欲しい。
また、チェックボックスのテキスト色に関しては、プラグインは Java で作ってあるため int 型の ARGB 形式になっているが、少し不便に感じたので、Unity の Color 形式のオーバーロードも作っておいた。あと少し特殊な仕様として色のパラメタ(ここでは checkBoxTextColor)に int値で 0 (= Color.clear)を与えた場合「指定なし」となるようにしてある(本来なら 0 は無色透明になるが、テキスト色には必要ないため)。ダイアログのスタイルの引数(ここでは style)を当てることもやってみたが、上手く反映されないようなので、個別に設定するようにした次第だ。指定するのが面倒なときはとりあえず 0 にしておけば良い(通常は黒になると思う)。また、int 型の ARGB 形式と Unity の Color 形式の相互変換は「Assets/FantomLib/Scripts/Graphics/XColor.cs」にまとめておいたので、自由に使って貰っても構わない。
ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。
(参考)R.style.theme
サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestDialogOK()」「OnReceiveChecked()」あたりを見て欲しい。
※この記事のUnityアセットはプラグインとして配布されています。
(関連記事)
【Unity】Androidでカスタマイズしたダイアログを動的生成できるプラグインを作ってみた
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Androidで日付・時刻選択ダイアログ(DatePicker, TimePicker)を使う
【Unity】Androidで数値・半角英数・パスワード入力ダイアログを使う
【Unity】Androidでテキスト入力ダイアログを使う
【Unity】Androidの選択ダイアログを使う
【Unity】Androidのテキスト読み上げ(TextToSpeech)を使う
【Unity】Androidのハードウェア音量操作・ハードウェアキーの無効化をする
【Android】【Java】AlertDialog を使ってみる
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/279-4b211fb1
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |