無料ブログはココログ

« レイアウト系 | トップページ | 画面遷移(他のアクティビティの起動) »

2013年6月 3日 (月)

イベントリスナー

20130603eventlistnersample_3

レイアウトの場合と似たことだが、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 については「テキストクリック処理」というような名称にするのだと思う。




参考URL: 「日本語プログラミング言語Mind」 (スクリプツ・ラボ)

« レイアウト系 | トップページ | 画面遷移(他のアクティビティの起動) »

Android」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/100109/57515633

この記事へのトラックバック一覧です: イベントリスナー:

« レイアウト系 | トップページ | 画面遷移(他のアクティビティの起動) »