カスタムビューを作成してOnClickListener
をセットしたのにタップしても反応しない時の対処方法です。
#問題の現象
例えばこんな感じのカスタムビューを作った時。
custom_button.java
public class CustomButton extends RelativeLayout {
private OnClickListener listener;
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
// 略
}
// 略
}
OnClickListener
をセットしても反応しません。
mCustomButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "clicked");
}
});
#対処方法
OnClickイベントをカスタムビュー自身でハンドリングしてあげると反応するようになります。
custom_button.java
public class CustomButton extends RelativeLayout {
private OnClickListener listener;
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
// 略
}
// 略
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (listener != null) listener.onClick(this);
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP
&& (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER
|| event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
if (listener != null) listener.onClick(this);
}
return super.dispatchKeyEvent(event);
}
public void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
}