Android singleTap / OnClick в WebView - PullRequest
9 голосов
/ 06 мая 2011

Я загружаю веб-представление с помощью строки HTML, я хочу показывать кнопки навигации, когда пользователь нажимает на веб-представление, я пытался С помощью прослушивателя onTouch событие касания возникает при прокрутке и нажатии, но Я хочу поймать одно нажатие / clickEvent, Не прокручивать события, касания ..., я реализовал SetOnClickListener как для WebView, так и для LinearLayout, ни один из них не работает для меня Любая помощь относительно этого

Ответы [ 4 ]

24 голосов
/ 30 января 2012

WebView не поддерживает OnClickListener.Кроме того, он потребляет события касания, даже если на веб-странице ничего не произошло, поэтому представления предков (например, LinearLayout) не имеют никакого шанса для создания события OnClick.Это очень прискорбно.

В качестве обходного пути я расширил RelativeLayout и вставил в него свой WebViewRelativeLayout я перезаписал 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);
}

}

3 голосов
/ 05 февраля 2014

Я изменил ответ Жолта Сафрани и поместил контент onInterceptTouchEvent в метод onTouch веб-просмотра, и он сработал.

webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
    Log.v(TAG,"Got a touch event in the web view!");

    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) {
             //click operation is here
           }
      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 false;
}           });
2 голосов
/ 24 мая 2011

На этой странице: http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/

Кажется, что события касания должны быть правильно перехвачены.Проверьте это:

@Override
public boolean dispatchTouchEvent(MotionEvent e){
    super.dispatchTouchEvent(e);
    return mGestureDetector.onTouchEvent(e);
} 
0 голосов
/ 24 декабря 2015

Рабочий код ::

final Boolean[] mMoveOccured = new Boolean[1];
final float[] mDownPosX = new float[1];
final float[] mDownPosY = new float[1];

final float MOVE_THRESHOLD_DP = 20 * getResources().getDisplayMetrics().density;

userPic.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
           final int action = event.getAction();
           switch (action) {
               case MotionEvent.ACTION_DOWN:
                    mMoveOccured[0] = false;
                    mDownPosX[0] = event.getX();
                    mDownPosY[0] = event.getY();
                    break;
               case MotionEvent.ACTION_UP:
                    if (!mMoveOccured[0]) {
                       Toast.makeText(v.getContext(), "Webview pressed", Toast.LENGTH_SHORT).show();
                    }
                    break;
               case MotionEvent.ACTION_MOVE:
                    if (Math.abs(event.getX() - mDownPosX[0]) > MOVE_THRESHOLD_DP || Math.abs(event.getY() - mDownPosY[0]) > MOVE_THRESHOLD_DP) {
                            mMoveOccured[0] = true;
                    }
                    break;
            }
            return false;
      }
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...