<HOME

クリック等のイベントを検知して処理を行う30分


ActivityやViewが表示されているときに、画面タッチやキー押下などのユーザーアクションが発生すると、

Android OSが、各UIコンポーネントに対してイベントの発生を通知してくれます。

例えば、Viewをクリックしたときには「onClick」というイベントが発生します。

Activityのライフサイクルの項でも「onCreate」や「onResume」などが登場していました。

Androidでは、OSが各コンポーネントへ「~が起こった」というイベントを通知するために、

「on~」と命名されたコールバックメソッドが実行されます。


イベントを検知する方法を学習します。


  1. 「EventTraining」アプリを作成します。

    1. Android Studioを起動し、新規プロジェクトを作成します。

      「Welcome to Android Studio」画面の場合は、「Start a new Android Studio project」をクリックします。

      別のプロジェクトが開いている場合は、ツールバーから「File」→「New」→「New Project...」をクリックします。

    2. HelloWorldの時と同じようにプロジェクトを作成していきます。

      アプリ名は「EventTraining」としてください。

      今回は「Backwards Compatibility (AppCompat)」のチェックは外しておきます。

  2. Backキーが押された際のイベントをActivityで検知してみましょう。

    1. MainActivity.javaに以下の処理を実装します。

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

      Backキーが押された際には「onBackPressed」というコールバックメソッドが実装されます。

      ここでは、Backキーが押された際に「onBackPressed」というメッセージを表示する処理を加えています。

    2. アプリを起動してBackキーを押してみてください。

      「onBackPressed」というメッセージが表示されればOKです。

    3. ちなみに、「super.onBackPressed」でsuper(継承元)クラスのonBackPressedメソッドの処理を実行していますが、

      その中でActivityの終了処理を行っているので、

      「onBackPressed」をオーバーライドして「super.onBackPressed」を呼ばないようにすれば、

      本来のonBackPressedによるActivityの終了処理が行われなくなります。


      つまり、BackキーでActivityを終了させたくない場合は、

      「onBackPressed」をオーバーライドして「super.onBackPressed」を呼ばないようにすれば良いということです。

  3. 画面がタッチされた際のイベントをActivityで検知してみましょう。

    1. MainActivity.javaに以下の処理を実装します。

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

      Activityがタッチされた際には「onTouchEvent」というコールバックメソッドが実装されます。

      ここでは、Activityがタッチされた際に、タッチイベントの詳細をメッセージ表示する処理を加えています。

    2. アプリを起動して画面をタッチしてみてください。

      「ACTION_DOWN」(タッチの「触れた際」のイベント)や「ACTION_UP」(タッチの「離した際」のイベント)といった種別や、

      「x[0]」「y[0]」(二点以上の同時タッチだとx[1]なども表示されます)といった座標などの情報がメッセージ表示されればOKです。

    3. ちなみに、「onTouchEvent」の返却値はbooleanになっており、イベントを消費したかどうかを意味します。

      「true」を返却すると、「イベントを消費した」(使い切った)として、本来のタッチ動作の一部が行われなくなります。

  4. Back以外にもキーが押された際のイベントをActivityで検知してみましょう。

    1. MainActivity.javaに以下の処理を実装します。

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

      キーが押された際には、「押し」で「onKeyDown」、「離し」で「onKeyUp」というコールバックメソッドが実装されます。

      ここでは、キーが押された際に、キーイベントの詳細をメッセージ表示する処理を加えています。

    2. アプリを起動して各種キーを押してみてください。

      「ACTION_DOWN」や「ACTION_UP」といった動作種別や、「KEYCODE_BACK」といったキー種別などの情報がメッセージ表示されればOKです。

      ただし、ホームキーや起動履歴キーなど、一部、イベントを検知できないキーもあります。

    3. ちなみに、「onKeyDown」や「onKeyUp」の返却値もbooleanになっており、イベントを消費したかどうかを意味します。

      「true」を返却すると、「イベントを消費した」(使い切った)として、本来のキー動作の一部が行われなくなります。

      例えば、onKeyDownでtrueを返却すると、ボリュームキーを押しても音量が変更されなくなります。

      「このキーコードは本来の処理をさせたくない」といった場合に利用されます。

  5. Viewがクリックされた際のイベントを検知してみましょう。

    1. 「activity_main.xml」を以下のように変更します。

      サンプル : activity_main.xml

      コードを表示するにはJavaScriptを有効にしてください

    2. MainActivity.javaを以下のように変更します。

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

      コンテンツView内のImageViewのインスタンスを取得し、「setOnClickListener」を実行しています。


      ViewもActivityのようにコールバックメソッドをオーバーライドしてイベントを検知する方法もありますが、

      その場合、新規にサブクラス(継承クラス)を定義して、そのクラス内でコールバックメソッドをオーバーライドしないといけません。

      それでは実装が大変ですので、Viewには、別の方法でイベントの発生を検知する方法が用意されています。


      それは、イベントの発生をListenする(聞き耳を立てる)ためのListenerインスタンスをViewにセットし、

      Listenerインスタンスがイベント発生時のコールバックを受ける、という方法です。


      ここでは、ViewのClickイベント用のListenerを生成し、setOnClickListenerでセットしています。

      ViewにClickイベントが発生すると、Listenerの「onClick」メソッドがコールされます。


      なお、ここでは無名クラスでListenerインタフェースを実装していますが、

      実装した独自クラスを宣言したり、Activity自身にインタフェースを実装する手法もあります。

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

      通常のJavaプロジェクトでは場合によっては無名クラスの利用は推奨されないことがありますが、

      Androidのコールバック系の実装では無名クラスが利用されることが一般的です。

    3. アプリを起動して各種UIをクリックしてみてください。

      ImageViewをクリックしたときに「onClick」というメッセージが表示されればOKです。

  6. キーが押された際のイベントをViewで検知してみましょう。

    1. MainActivity.javaに以下の処理を実装します。

      コードを表示するにはJavaScriptを有効にしてください

      サンプル : MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

      各UIに対してOnKeyListenerをセットし、onKeyがコールされたら自身のID名を表示するようにしています。

    2. アプリを起動して各種キーを押してみてください。

      Viewでのキーイベント検知は、フォーカスが当たっているViewのみが可能であることがわかりました。