3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語MindをAndroidに移植した時の記録(ステップ4/9)

Posted at

はじめに

 この記事はだいぶ前(2012年)にココログの「キリーの日本語プログラミング」に掲載したコラムですが、再編集してこちらにも投稿します。今となっては古い話ではありますが、OSによってプログラム言語(AndroidではJava)が決め打ちされている環境で規定と異なるもの(Mind)を走らせたことの記録としてお読みください。

イベントリスナー

 レイアウトの場合と似た話だが、Java側のオブジェクトをMind側に伝えても意味が無いので簡単な仕組みで両者間で連絡が取れるようにする。

20130603eventlistnersample_3.png

クリックイベントリスナーの登録

 まずクリックリスナーの登録は以下のように行う。

[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)。

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?