Android application development 第9章:イベントリスナーの定義(Java視点からの違和感に注意)

Androidアプリでも、JavaのGUI開発と同様に「ユーザーの操作に応じた処理」を書く必要があります。たとえば「ボタンが押されたときに何かをする」などです。

しかし、Android特有の書き方や慣習があり、Swing/AWTなどに慣れたJavaエンジニアにとっては「なんか書き方が違うぞ」と違和感を覚える場面があります。


■ JavaのGUIでの典型的なイベントリスナーの書き方(例:Swing)

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("ボタンが押された!");
    }
});

このように、明示的にインターフェースを実装して、イベント処理を書くのが定番です。


■ Androidでの典型的な書き方(匿名クラス or ラムダ式)

Button button = findViewById(R.id.clickButton);

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("MainActivity", "ボタンが押された!");
    }
});

または、Java 8 以降ならラムダ式も使えます:

button.setOnClickListener(v -> {
    Log.d("MainActivity", "ボタンが押された!");
});

■ 違和感ポイント①:イベントリスナーがView.OnClickListener

Java経験者だと、「ActionListenerじゃないの?」「なんでViewがListenerを定義してるの?」と思うかもしれません。

これはAndroidの設計思想によるものです。

  • Androidでは全てのUI部品(View)はViewを継承している
  • だから「ボタンのクリックリスナー」ではなく「Viewのクリックリスナー」として定義されている
  • 結果として、ボタンもテキストも画像も、全部setOnClickListener()で処理できるようになっている

つまり、Listenerの粒度が広く統一されていると考えると納得がいきます。


■ 違和感ポイント②:インターフェースを直接使わず、メソッドで登録?

JavaのGUIでは addListener() という命名が多いのに対し、Androidでは setOnClickListener() のように “set~” の形でリスナーを登録します。

これは、「リスナーは1つしか設定できない」ことを示しています。

button.setOnClickListener(...); // 上書きされる

イベントを1つの処理に絞る設計になっており、複数のリスナーを追加することはできません(同時に複数の処理を走らせたい場合は、1つのonClick内で複数の処理を呼び出します)。


■ 違和感ポイント③:イベント引数が独自のView v

Javaでは ActionEvent e のようにイベント情報を持つオブジェクトが渡されますが、Androidでは基本的に押されたViewそのもの(View v)が引数になります

そのため、同じリスナーを複数のボタンに使って、v.getId() でどのボタンかを判別するケースもよくあります。

View.OnClickListener listener = v -> {
    if (v.getId() == R.id.button1) {
        // ボタン1が押された
    } else if (v.getId() == R.id.button2) {
        // ボタン2が押された
    }
};

■ まとめ:Androidのイベントリスナーは「統一されたViewベース」

項目Java GUI(Swing等)Android
イベント対象明示的な部品(JButtonなど)すべてのView(Button含む)
リスナー定義ActionListenerなど明示的View.OnClickListenerなど
登録方法addXXXListener()setXXXListener()
引数ActionEventなど押されたViewそのもの

Androidでは「部品=View」「イベント=Viewへの操作」として抽象化されているため、最初は戸惑っても、慣れれば汎用的に書けるようになります。

mh

Related Posts

Android application development 第33章:実践ミニアプリ:天気情報アプリ

Android application development 第32章:実践ミニアプリ:シンプルなToDoリスト

You Missed

Kubernetes Learning 第40章:Kubernetesのアップグレードとバージョン管理 ~安全にバージョンを上げるための基本知識~

  • 投稿者 mh
  • 6月 24, 2025
  • 82 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第13章:ストレージとデータベースの基礎 : オブジェクトストレージ: Cloud Storage(バケット、オブジェクト、ストレージクラス)- あなたの「データ置き場」

  • 投稿者 mh
  • 6月 23, 2025
  • 98 views

Kubernetes Learning 第39章:CRD(Custom Resource Definition)とは?~Kubernetesに“自分専用のリソース”を追加する仕組み~

  • 投稿者 mh
  • 6月 21, 2025
  • 99 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第12章:Cloud CDN(Content Delivery Network):あなたのWebサイトを「世界中のユーザーに超高速で届ける宅配便ネットワーク」

  • 投稿者 mh
  • 6月 20, 2025
  • 116 views

Kubernetes Learning 第38章:Operatorとは? ~Kubernetesに「運用の自動化ロボット」を組み込む仕組み~

  • 投稿者 mh
  • 6月 19, 2025
  • 105 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第11章:Cloud Load Balancing:あなたのGCPリソースを「賢く振り分ける交通整理の達人」

  • 投稿者 mh
  • 6月 18, 2025
  • 121 views