はじめに
この記事はだいぶ前(2012年)にココログの「キリーの日本語プログラミング」に掲載したコラムですが、再編集してこちらにも投稿します。今となっては古い話ではありますが、OSによってプログラム言語(AndroidではJava)が決め打ちされている環境で規定と異なるもの(Mind)を走らせたことの記録としてお読みください。
イベントリスナー
レイアウトの場合と似た話だが、Java側のオブジェクトをMind側に伝えても意味が無いので簡単な仕組みで両者間で連絡が取れるようにする。
クリックイベントリスナーの登録
まずクリックリスナーの登録は以下のように行う。
[Mindのソースコード]
メインとは
~略~
ボタン1を クリックリスナーを登録し
レイアウトの時もそうだったが、オブジェクトのクラス(ボタンなど)別にそれぞれ登録処理を使い分けるのはMindのソースが煩雑になるため、Mindの処理単語は「クリックリスナーを登録」1つとし、Mind→C→Javaと遷移した後、Java内部で処理を分岐するようにした。以下のようになる。
[Javaでの登録処理] (Mind側から呼び出される)
public int j_setOnClickListener( int id, int type, int seqno )
{
int retcode;
retcode = 1;
switch ( type )
{
case typeTextView:
break;// (未実装)
case typeEditText:
break;// (未実装)
case typeButton:
buttonsMind[seqno] = id;
buttons[seqno].setOnClickListener( new onClickListenerForButton() );
break;
default: /*該当無し*/
retcode = 0;
break;
}
return retcode;
}
上記のうち buttonsMind[seqno] = id という処理だが、これはMindで管理しているボタン情報をJava側でも記憶しておき、イベント発生時、Mind側に処理が移った際に押されたボタンの識別がMindでもできるようにするためである。(Mindの側にビューオブジェクトを渡されても困るため)
イベント発生時の処理
次にイベント発生時の処理だが、まずJavaに入って来るので以下のようにイベント受け取る。
[Javaのイベントリスナー] (Android OS から呼び出される)
//↓注:これはボタン用。クラス毎に用意する
private class onClickListenerForButton implements OnClickListener {
@Override
public void onClick( View v )
{
int found;
int viewno;
found = -1;
for ( viewno=0; viewno<buttonsCount; viewno++ )
{
if ( v == buttons[viewno] )
{
found = viewno;
break;
}
if ( found == -1 )
{
return;
}
/* ----------------------------------------- */
/* --------- Mindカーネルを呼ぶここから ----- */
String retcode = calltellButtonClick( ButtonsMind[found] );
/* -------- Mindカーネルを呼ぶここまで ----- */
/* ---------------------------------------- */
}
}
上記ではMindに通知する情報として buttonsMind[] という配列を参照しているが、前記したようにMind側でボタンを識別できるようにするためである。
一方、Mindでは次のようなソースコードでイベント処理を記述する。
[Mindのイベント処理のソースコード]
色の状態は 2個の 変数。
ボタンクリック処理は 本定義 (ボタン情報 → ・)
_ボタンは ビュー
_番号は 変数
_ボタンに 入れ
_ボタンの IDからビュー番号を得て _番号に 入れ
色の状態(_番号)を 一つ増加し
色の状態(_番号)と 1を ANDし 真?
ならば 赤色を
さもなければ
黒色を
つぎに
_ボタンに 文字の色を設定する
。
上記のようにMindでは「本定義」を使ってイベント処理を実現する。(ランタイム内部で既に仮定義してある)。
ほかにも、恐らく TextView については「テキストクリック処理」というような名称にするのだと思う。
つづく
最近、Mindユーザーの@mylifewithviolinさんがMindコンパイラの内部に興味を持たれているようなので参考情報として投稿してみました。本記事はしばらくつづきます。次は(ステップ5/9)。