WebView
не поддерживает OnClickListener
.Кроме того, он потребляет события касания, даже если на веб-странице ничего не произошло, поэтому представления предков (например, LinearLayout
) не имеют никакого шанса для создания события OnClick.Это очень прискорбно.
В качестве обходного пути я расширил RelativeLayout
и вставил в него свой WebView
.В RelativeLayout
я перезаписал onInterceptTouchEvent
и искал события касания.При обнаружении касания RelativeLayout
s OnClickListener
вызывается с performClick()
.
public class TapAwareRelativeLayout extends RelativeLayout {
private final float MOVE_THRESHOLD_DP = 20 * getResources().getDisplayMetrics().density;
private boolean mMoveOccured;
private float mDownPosX;
private float mDownPosY;
public TapAwareRelativeLayout(Context context) {
super(context);
}
public TapAwareRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mMoveOccured = false;
mDownPosX = ev.getX();
mDownPosY = ev.getY();
break;
case MotionEvent.ACTION_UP:
if (!mMoveOccured) {
// TAP occured
performClick();
}
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(ev.getX() - mDownPosX) > MOVE_THRESHOLD_DP || Math.abs(ev.getY() - mDownPosY) > MOVE_THRESHOLD_DP) {
mMoveOccured = true;
}
break;
}
return super.onInterceptTouchEvent(ev);
}
}