C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

ボタンがクリックされると, Clickイベント, Touchイベント, LongClickイベントが以下の順に発生する.
(1) OnTouchイベント (MotionEvent.ACTION_DOWN)
(2) OnLongClickイベント
(3) OnTouchイベント (MotionEvent.ACTION_UP)
(4) OnClickイベント
注) 長押しクリックでなく単なるクリックの場合, 2番目のOnLongClickイベントが省略される.

Clickイベントを処理する

ボタンをクリックするとClickイベントを発生するので, このClickイベントを処理するイベントリスナを設定する.
    • findViewByIdメソッドで, 指定したリソースインデックスのIDに対応したボタンのインスタンスを取得する.
    • View.OnClickListenerインタフェースを実装したオブジェクトをイベントリスナとして設定する.
    • onClickメソッドにクリックされたときの処理を記述する.
package com.moonlight_aska.android.button01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Button01 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button btn = (Button)findViewById(R.id.button_id);
    btn.setOnClickListener(new View.OnClickListener() {
      // ボタンがクリックされた時のハンドラ
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        // クリックされた時の処理を記述
        Log.v("OnClick", "Button was clicked.");
      }
    });
  }
}


Touchイベントを処理する

タッチモードにおいて, ボタンをタッチするとTouchイベントを発生するので, このTouchイベントを処理するイベントリスナを設定する.
単にボタンをタッチすると, 指がタッチしたことを示すMotionEvent.ACTION_DOWNとタッチした指が離れたことを示すMotionEvent.ACTION_UPの2つのTouchイベントが発生する.
    • findViewByIdメソッドで, 指定したリソースインデックスのIDに対応したボタンのインスタンスを取得する.
    • View.OnTouchListenerインタフェースを実装したオブジェクトをイベントリスナとして設定する.
    • onTouchメソッドにタッチされたときの処理を記述する.
package com.moonlight_aska.android.button01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

public class Button01 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

    Button btn = (Button)findViewById(R.id.button_id);
    btn.setOnTouchListener(new View.OnTouchListener() {
      // ボタンがタッチされた時のハンドラ
      @Override
      public void onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
          // 指がタッチした時の処理を記述
          Log.v("OnTouch", "Touch Down");
        }
        else if(event.getAction() == MotionEvent.ACTION_UP) {
          // タッチした指が離れた時の処理を記述
          Log.v("OnTouch", "Touch Up");
        }
        return false;
      }
    });
  }
}


LongClickイベントを処理する

ボタンを長押しクリックするとLongClickイベントが発生するので, このLongClickイベントを処理するイベントリスナを設定する.
    • findViewByIdメソッドで, 指定したリソースインデックスのIDに対応したボタンのインスタンスを取得する.
    • View.OnLongClickListenerインタフェースを実装したオブジェクトをイベントリスナとして設定する.
    • onLongClickメソッドに長押しクリックされたときの処理を記述する.
package com.moonlight_aska.android.button01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Button01 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

    Button btn = (Button)findViewById(R.id.button_id);
    btn.setOnLongClickListener(new View.OnLongClickListener() {
      // ボタンが長押しクリックされた時のハンドラ
      @Override
      public boolean onLongClick(View v) {
        // TODO Auto-generated method stub
        // 長押しクリックされた時の処理を記述
        Log.v("OnLongClick", "Button was clicked");
        return false;
      }
    });
  }
}



このページへのコメント

askaです.

ご指摘ありがとうございます.

説明はOnTouchメソッドと書いておきながら, コードはOnClick()となっていましたので, 修正しました.

Posted by aska 2014年07月03日(木) 00:09:42

連投失礼します。
Touchイベント検出で加えて
MotionEvent.ACTION_DOWNとそれ以外での判定にしてしまうとMove時に毎回処理が走ってしまいます。
MotionEvent.ACTION_UPの判定も必要でした。

Posted by ryo 2014年06月18日(水) 18:04:26

Touchイベント検出ですが、
onClickではできませんでした。
public boolean onTouch(View v, MotionEvent event)
だと思います。

Posted by ryo 2014年06月18日(水) 17:33:14

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

AD



管理人のみ編集できます