2012年3月13日火曜日

AndroidでFlex的にクリックイベントをメソッドにバインディングするには?

AndroidでもFlexのMXML的にコンポーネントのレイアウトを定義するXMLがある。

それなら、Flex的にボタンクリックイベントをメソッドにバインディングしたくなる。どうすれば?


src/BtnEvtBindingActivity.java

package com.blogspot.kinsentansa.btnevtbinding;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class BtnEvtBindingActivity extends Activity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  /**
   * XMLで定義したViewから呼ぶ用のメソッド
   * 
   * == 条件 ==
   * ・publicであること(でないとillegal state exceptionが出るよ)
   * ・引数にViewを持つこと
   * 
   * メソッド名は何でもいい。
   * 返り値も何でもいいようだけど、特に使い道を思いつかない。
   * 
   * @param view
   */
  public void onClickView(View view) {
    Toast.makeText(BtnEvtBindingActivity.this, "onClickView()!", Toast.LENGTH_SHORT).show();
  }

}



res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="onClickView"
android:text="button" />

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clickable="true"
android:onClick="onClickView"
android:text="Clickable TextView"
android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

Button「btn」の「android:onClick」プロパティーに、上のActivityで定義した「onClickView」を設定すればOK。


TextViewの場合も同様にすればOK。ただし、「android:clickable="true"」を忘れずに。

TextView以外にもclickableにできるコンポーネントがあるかもしれない。そういったコンポーネントにも使える技だと思う。

深く見ていけば、onClick以外にも色々とイベントハンドラがあるかもしれない。