【Unity】Androidで数値・半角英数・パスワード入力ダイアログを使う 
2017/11/12 Sun [edit]
Unity で Android のテキスト入力ダイアログを使うプラグインの拡張版。Unity の Input Field にも色々なオプションを設定できるので機能的には被るが、ダイアログって思ったより使い勝手が良いので今回も試しに作ってみた。まぁ、ちょっとしたことなら UI を作らないで簡単に使えるから便利という気持ちが大きいけどね(笑)。事実 Android の標準機能を利用するプラグインを公開して以来、閲覧数も急増しているので、もしかしたら「ダイアログを簡単に使いたい」って人は多かったのかもしれない。
今回も Android のダイアログをカスタマイズする方法でテキスト入力ダイアログのバリエーションを作ってみた。テキスト入力ならやはり数値、半角英数のみ、パスワードの3種はあった方が良いかなと。せっかくなので、数値入力ダイアログには整数と小数を、半角英数入力にはそれ以外の記号などを含む文字を、パスワード入力には数字のみのパスワード(暗証番号みたいな)を使えるようにしておいた。どれも結局は単なるテキスト入力の機能なので、使い方は難しくはないだろう。
今回も Androidの基本機能を利用するプラグインのアップデート版となる。追加内容・仕様変更などはなるべく更新履歴に書くようにしているが、基本的にはそのまま使えるようにしているので、旧バージョンがある場合は上書きでも構わないと思う。プラグイン自体のセットアップは以前の記事を参照して欲しい。自分で作りたい場合は簡略化したものだが、今回も元の Java コードを書いておくので挑戦してみるのも良いだろう(※Java コードは解説用に一部抜粋・省略したものであって、そのままコピペでは使えないことに注意)。
|
パッケージに同梱されているサンプルでは、シーン「Assets/_Test/Scenes/DialogTest」にまとまっているので、適当に複製などして自由に使って欲しい。
(※) Unity 5.6.3p1 / AndroidStudio 2.3.3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認
■数値入力のテキストダイアログを使う

●Unity から Android の数値入力のテキストダイアログを使う C# コード
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowNumericTextDialog(title, message, defValue, maxLength, enableDecimal, enableSign,
callbackGameObject, callbackMethod, okCaption, cancelCaption, style);
#endif
●プラグイン内の対応する Java コード
import android.content.Context;
import android.content.DialogInterface;
import android.text.InputFilter;
import android.text.InputType;
import android.widget.EditText;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;
EditText editText = new EditText(context);
editText.setSingleLine(true);
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter.LengthFilter(maxLength);
editText.setFilters(filters);
int inputType = InputType.TYPE_CLASS_NUMBER;
if (enableDecimal)
inputType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;
if (enableSign)
inputType |= InputType.TYPE_NUMBER_FLAG_SIGNED;
editText.setInputType(inputType);
editText.setText(String.valueOf(defValue));
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
switch(which) {
case DialogInterface.BUTTON_POSITIVE:
UnitySendMessage(callbackGameObject, callbackMethod, editText.getText().toString());
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context, styleId);
builder.setTitle(title)
.setMessage(message)
.setView(editText)
.setPositiveButton(okCaption, listener)
.setNegativeButton(cancelCaption, null)
.show();
これは数値のみ入力可能な単一行のテキストを入力するためのダイアログ(AlertDialog)である。入力できる数値は「enableDecimal = true」のとき小数の入力が可能に、「enableDecimal = false」のときは整数のみとなる。また「enableSign = true」のときは頭に正負の符号("+" or "-")を付けることができる。それ以外の文字ははじかれると考えて良い。
maxLength では文字数制限ができるが、これには小数点(".")や符号("+" or "-")も含まれるので注意。少数入力・符号入力可としたときはあらかじめ桁数を多くとって、数値をチェックする必要がある。
入力値は「OK」ボタンで戻り値として入力されたテキストがヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。またキャンセルボタンを押した時や、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない。
ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。
(参考)R.style.theme
サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestDialogNumeric()」あたりを見て欲しい。
■半角英数入力のテキストダイアログを使う

●Unity から Android の半角英数入力のテキストダイアログを使う C# コード
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowAlphaNumericTextDialog(title, message, text, maxLength, addChars,
callbackGameObject, callbackMethod, okCaption, cancelCaption, style);
#endif
●プラグイン内の対応する Java コード
import android.content.Context;
import android.content.DialogInterface;
import android.text.InputFilter;
import android.text.InputType;
import android.widget.EditText;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;
EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
InputFilter[] filters = new InputFilter[2];
filters[0] = new InputFilter.LengthFilter(maxLength);
filters[1] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source.toString().matches("^[a-zA-Z0-9" + Pattern.quote(addChars) + "]+$")) {
return source;
} else {
return source.toString().replaceAll("[^a-zA-Z0-9" + Pattern.quote(addChars) + "]", "");
}
}
};
editText.setFilters(filters);
editText.setText(text);
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
switch(which) {
case DialogInterface.BUTTON_POSITIVE:
UnitySendMessage(callbackGameObject, callbackMethod, editText.getText().toString());
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context, styleId);
builder.setTitle(title)
.setMessage(message)
.setView(editText)
.setPositiveButton(okCaption, listener)
.setNegativeButton(cancelCaption, null)
.show();
これは半角英数(a~z, A~Z, 0~9)のみ入力可能な単一行のテキストを入力するためのダイアログ(AlertDialog)である。ID 入力などに良い。ただし一部の記号なども入力可能にしたいときのために「addChars」に例外的に使用できる文字リストを指定できる。例えば「addChars = "_-.@"」のようにした場合、"_", "-", ".", "@" も入力できるようになる。実際のところ、この「addChars」の文字種はチェックしてないので、全角文字を入れたらそれも使えるようになってしまう。なので、そのあたりの使用法はお任せするしかない(笑)。
入力値は「OK」ボタンで戻り値として入力されたテキストがヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。またキャンセルボタンを押した時や、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない。
ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。
(参考)R.style.theme
サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestDialogAlphaNumeric()」あたりを見て欲しい。
■パスワード入力のテキストダイアログを使う

●Unity から Android のパスワード入力のテキストダイアログを使う C# コード
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowPasswordTextDialog(title, message, text, maxLength, numberOnly,
callbackGameObject, callbackMethod, okCaption, cancelCaption, style);
#endif
●プラグイン内の対応する Java コード
import android.content.Context;
import android.content.DialogInterface;
import android.text.InputFilter;
import android.text.InputType;
import android.widget.EditText;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;
EditText editText = new EditText(context);
editText.setSingleLine(false);
if (numberOnly)
editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
else
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter.LengthFilter(maxLength);
editText.setFilters(filters);
editText.setText(text);
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
switch(which) {
case DialogInterface.BUTTON_POSITIVE:
UnitySendMessage(callbackGameObject, callbackMethod, editText.getText().toString());
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context, styleId);
builder.setTitle(title)
.setMessage(message)
.setView(editText)
.setPositiveButton(okCaption, listener)
.setNegativeButton(cancelCaption, null)
.show();
これは半角英数記号を含むパスワードのテキストを入力するためのダイアログ(AlertDialog)である。ただし「numberOnly = true」にすると、暗証番号のように数字のみのパスワードにすることもできる。そのどちらもエンコード(暗号化)はしてないので、Web を通じたりローカルに保存する場合は、何らかの暗号化はした方が良いだろう。
入力値は「OK」ボタンで戻り値として入力されたテキストがヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。またキャンセルボタンを押した時や、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない。
ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。
(参考)R.style.theme
サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestDialogPassword()」あたりを見て欲しい。
■更新履歴
今回のアップデートを簡単に説明しておくと以下のようになる。[⇒全体の更新履歴はこちら]
・数値/半角英数/パスワード入力のテキストダイアログを追加。
・テキスト入力ダイアログ(単一行/複数行)にメッセージを入れるオーバーロードを追加。
・テキスト入力ダイアログ(単一行/複数行)の初期値にも文字数制限がかかるように修正。
・テキスト入力ダイアログ(単一行/複数行)が表示されたときに全選択とソフトキーボードが出るようにした。
※以前のバージョン上書きでも問題なく動作すると思います。
実際の Java コードは色々値をチェックしたり条件分岐したり、高速化のためにキャッシュしたり、StringBuilderを使ったりしているが、長くなるのでここでは簡略化したものを書いてあると考えて欲しい。Java を知っている人なら中身は非常に簡単なものばかりなので、AndroidStudio を使ったことあるなら AAR プラグインをビルドするのに挑戦してみるのも良いだろう。
※この記事のUnityアセットはプラグインとして配布されています。
(関連記事)
【Unity】Androidでテキスト入力ダイアログを使う
【Unity】Androidでカスタマイズしたダイアログを動的生成できるプラグインを作ってみた
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Androidでチェックボックス付きのアラートダイアログ(AlertDialog)を使う
【Unity】Androidで日付・時刻選択ダイアログ(DatePicker, TimePicker)を使う
【Unity】Androidの選択ダイアログを使う
【Unity】Androidのテキスト読み上げ(TextToSpeech)を使う
【Unity】Androidのハードウェア音量操作・ハードウェアキーの無効化をする
【Android】【Java】音声入力(音声認識)で文字列を取得する
【Android】【Java】AlertDialog を使ってみる
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/277-fefef578
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |