Câu hỏi Android singleTap / OnClick trong WebView


tôi đang tải chế độ xem Web với Chuỗi Html, tôi muốn hiển thị các nút điều hướng khi người dùng nhấn vào chế độ xem web, tôi đã thử Với trình nghe onTouch, sự kiện chạm sẽ tăng lên khi cuộn và nhấn nhưng tôi muốn bắt một cú chạm / clickEvent, Không cuộn chạm vào sự kiện ..., tôi đã triển khai SetOnClickListener cho cả WebView và LinearLayout, Không ai trong số họ không làm việc cho tôi Bất kỳ trợ giúp nào về vấn đề này


8
2018-05-06 05:34


gốc




Các câu trả lời:


WebView không hỗ trợ OnClickListener. Và nó cũng tiêu thụ các sự kiện cảm ứng ngay cả khi không có gì xảy ra trên trang web, do đó tổ tiên xem (như của bạn LinearLayout) không có cơ hội để tạo ra sự kiện OnClick. Nó rất đáng tiếc.

Để giải quyết sự cố, tôi đã mở rộng RelativeLayout và đặt của tôi WebView bên trong nó. bên trong RelativeLayout Tôi đã ghi đè onInterceptTouchEvent và đang tìm kiếm sự kiện nhấn. Nếu phát hiện thấy một vòi nước thì RelativeLayout'S OnClickListener được gọi với 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);
}

}


24
2018-01-30 14:41



Hey @Saffer u có thể cung cấp một số chi tiết có thể làm thế nào để sử dụng này. cảm ơn.. - sandy
@ Zsolt - Tôi đã không nhận được làm thế nào để đưa webView trong RelativeLayout, u có thể xin vui lòng cho biết thêm về điều này? - Braj
Bạn đặt WebView vào RelativeLayout trong tệp sơ đồ bố trí xml. Kích thước u được chỉ định cho WebView trước đây bây giờ là đặc tả kích thước của RelativeLayout và u làm cho WebView khớp với kích thước của cha mẹ của nó (RelativeLayout). Điều này sẽ làm cho chúng có cùng kích thước trong khi RelativeLayout kết thúc tốt đẹp WebView. - Zsolt Safrany
1 cho một giải pháp rất tốt đẹp ... nó hoạt động hoàn hảo! - Braj
Giải pháp tuyệt vời, đây sẽ là câu trả lời được chấp nhận. - 2Dee


Từ trang này: http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/

Có vẻ như các sự kiện chạm phải được giữ đúng cách. Kiểm tra điều này:

@Override
public boolean dispatchTouchEvent(MotionEvent e){
    super.dispatchTouchEvent(e);
    return mGestureDetector.onTouchEvent(e);
} 

2
2018-05-24 16:11





Tôi đã sửa đổi câu trả lời của Zsolt Safrany và tôi đặt onInterceptTouchEventnội dung của vào webview onTouch và nó hoạt động.

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
2018-02-04 20:37



Giải pháp này chứa các lỗi (event và ev.getX ()) và hoạt động như giải pháp đầu tiên, tức là không hoạt động. - CoolMind


Mã làm việc ::

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;
      }
 });

0
2017-12-24 06:40