FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】Androidでテキスト入力ダイアログを使う

【Unity】Androidでテキスト入力ダイアログを使う  


 Unity には元から「Input Field」というテキスト入力コンポーネントはあるが、実際にスマホで使ってみると入力欄が狭く感じたり、複数行テキストのときなどは前後が見づらかったりすることも多い(あと Unity2017.1.1 までのバグで Android 上で InputField の日本語入力ができなかった。それも作った理由。※Unity2017.2.0 では修正されている)。なのでちょっと試しに Android のダイアログをカスタマイズする方法でテキスト入力のダイアログを作ってみた。ファイル名入力のような単一行の入力のときと、文章の編集のような複数行の入力ができると便利だと思ったので、中身はあまり変わらないが2つの種類を用意した。

 今回もAndroidの基本機能を利用するプラグインのアップデート版となる。追加内容・仕様変更などはなるべく更新履歴に書くようにしているが、基本的にはそのまま使えるようにしているので、旧バージョンがある場合は上書きでも構わないと思う。プラグイン自体のセットアップは以前の記事を参照して欲しい。自分で作りたい場合は簡略化したものだが、今回も元の Java コードを書いておくので挑戦してみるのも良いだろう(※Java コードは解説用に一部抜粋・省略したものであって、そのままコピペでは使えないことに注意)。


>>プラグイン&サンプルをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

●ファイル名入力や文章の編集に使っている

 パッケージに同梱されているサンプルでは、単一行入力はシーン「Assets/_Test/Scenes/PluginTest」のボタン「Dialog Text」に、複数行入力はシーン「Assets/_Test/Scenes/SpeechRecognizerTest」の音声認識・テキスト読み上げの文字列表示パネルに使用例としてダイアログが出るようにしてある(タップすると出る)。コピペなどして自由に使って欲しい。


(※) 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.ShowSingleLineTextDialog(title, text, maxLength, callbackGameObject, callbackMethod,
okCaption, cancelCaption, style);
#endif

●プラグイン内の対応する Java コード
import android.content.Context;
import android.content.DialogInterface;
import android.text.InputFilter;
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);

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)
.setView(editText)
.setPositiveButton(okCaption, listener)
.setNegativeButton(cancelCaption, null)
.show();

 これは通常改行のない単一行のテキストを入力するためのダイアログ(AlertDialog)である。名前の入力などに良い。「OK」ボタンで戻り値として入力されたテキストがヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。またキャンセルボタンを押した時や、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない

 ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。

(参考)R.style.theme

 サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestDialogText()」「OnReceiveText()」あたりを見て欲しい。



■複数行テキスト入力ダイアログを使う


●Unity から Android の複数テキスト入力ダイアログを使う C# コード
using FantomLib;

#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowMultiLineTextDialog(title, text, maxLength, lines, callbackGameObject, callbackMethod,
okCaption, cancelCaption, style);
#endif

●プラグイン内の対応する Java コード
import android.content.Context;
import android.content.DialogInterface;
import android.text.InputFilter;
import android.view.Gravity;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;

EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setImeOptions(EditorInfo.IME_FLAG_NO_ENTER_ACTION);
editText.setLines(lines);
editText.setGravity(Gravity.TOP);

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().replaceAll("\r\n", "\n").replaceAll("\r", "\n"));
break;
}
}
};

AlertDialog.Builder builder = new AlertDialog.Builder(context, styleId);
builder.setTitle(title)
.setView(editText)
.setPositiveButton(okCaption, listener)
.setNegativeButton(cancelCaption, null)
.show();

 こちらは改行を含む複数行のテキストを入力するためのダイアログ(AlertDialog)である。文章の編集などに良い。「OK」ボタンで戻り値として入力されたテキストがヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に改行("\n"に統一)を含む文字列で返ってくる。またキャンセルボタンを押した時や、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない

 ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。

(参考)R.style.theme

 サンプルコードは「Assets/_Test/Scripts/TextToSpeechTest.cs」の「EditText()」「OnEditText()」あたりを見て欲しい。



■更新履歴

 今回のアップデートを簡単に説明しておくと以下のようになる。[⇒全体の更新履歴はこちら]

テキスト入力ダイアログ(単一行/複数行)の追加。

17/11/10(一部修正) [以下※全更新履歴より]
・[修正]テキスト入力ダイアログ(単一行/複数行)の初期値にも文字数制限がかかるように修正。
・[修正]テキスト入力ダイアログ(単一行/複数行)が表示されたときに全選択とソフトキーボードが出るようにした。

※以前のバージョン上書きでも問題なく動作すると思います。



 実際の Java コードは色々値をチェックしたり条件分岐したり、高速化のためにキャッシュしたり、StringBuilderを使ったりしているが、長くなるのでここでは簡略化したものを書いてあると考えて欲しい。Java を知っている人なら中身は非常に簡単なものばかりなので、AndroidStudio を使ったことあるなら AAR プラグインをビルドするのに挑戦してみるのも良いだろう。


※この記事のUnityアセットはプラグインとして配布されています。



(関連記事)
【Unity】Androidでカスタマイズしたダイアログを動的生成できるプラグインを作ってみた
【Unity】Androidで数値・半角英数・パスワード入力ダイアログを使う
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Androidで日付・時刻選択ダイアログ(DatePicker, TimePicker)を使う
【Unity】Androidでチェックボックス付きのアラートダイアログ(AlertDialog)を使う
【Unity】Androidの選択ダイアログを使う
【Unity】Androidのテキスト読み上げ(TextToSpeech)を使う
【Unity】Androidのハードウェア音量操作・ハードウェアキーの無効化をする
【Android】【Java】音声入力(音声認識)で文字列を取得する
【Android】【Java】AlertDialog を使ってみる


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン  ニコニ立体ちゃん 
tb: 0   cm: --



トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/276-b1b16760
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop