A Day In The Life

とあるプログラマの備忘録

AndroidとiPhoneのイベントハンドラの実装方法を比較する

両者の大きな違いはiPhoneはInterface Builderでイベントの定義ができるのに対しAndroidはレイアウトXMLでイベントの定義ができないところです。
またiPhoneはselectorという関数ポインタに似た仕組みがあるのでコード上でも割と簡単にイベントの定義ができるのに対し、Androidはイベントリスナーを実装する以外の実装方法がありません。これはAndroid,iPhone云々というよりは言語依存によるところが大きいです。

iPhone

  • Interface Builderを使う場合

    Interface Builderでボタンとイベントの紐付きを設定する(省略)

    @interface HogeViewController : UIViewController {
    }
    - (IBAction) onClick:(id)sender;
    @end
    
    @implementation
    - (IBAction) onClick:(id)sender {
      // クリック時の処理
    }
    @end
    


  • Interface Builderを使わない場合

    @implementation HogeViewController
    synthesize button;
    - (void)viewDidLoad {
      [super viewDidLoad];
      [button addTarget:self
                 action:@selector(onClick:)
       forControlEvents:UIControlEventTouchUpInside];
    }
    - (IBAction) onClick:(id)sender {
      // クリック時の処理
    }
    @end
    

Android

  • レイアウトXMLでイベントとViewの紐付きを定義できない

    public class HogeActivity extends Activity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button)findViewById(R.id.button);
        button.setText("Push");
        button.setOnClickListener(new OnClickListener() {
          public void onClick(View v) {
            // クリック時の処理
          }
        });
      }
    }