短いコードだったらAndroidJavaなんちゃら使って書いたほうが楽かなーなどと思ったけどなんか引っかかったのでメモ。
あまりネイティブは分からないが…。
とりあえずToast作成に必要な物を考える
javaだとandroid.widget.Toastをインポートして
Toast.makeText(Context context, CharSequence text, int duration) を使って作成するらしい
(new Toast(Context context)でやったら「makeText使わないで作成しただろ」とエラーが出てしまった)
それぞれの引数は
context → currentActivity.getApplicationContextで出せる
text → CharSequence型とか分かんないけど、表示したい文字列なのでstringでできるだろう
int → Toastクラスに定数が用意されているので、GetStatic<int>で受け取る
それで以下のように書いた
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject> ("makeText",
context,
"Test Toast",
toastClass.GetStatic<int>("LENGTH_SHORT")
);
toast.Call ("show");
けど、Looper.prepare()がどうのこうのとエラーが出たため、調べて以下のように修正。
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject> ("makeText",
context,
"Test Toast",
toastClass.GetStatic<int>("LENGTH_SHORT")
);
toast.Call ("show");
}));
こいつで見事"Test Toast"が表示された。
後は好きな文字列を入れられるようにするのがいいかな。
ClassだObjectだCall(Static)だGet/Set(Static)だと出てきてちんぷんかんぷんになってたけど、C#でも同じことしてるだろ、と考えたら少しは書けるようになった。
でも書いてて自分があまり理解してないとこがあるので、もうすこしネイティブを勉強せねばだ。