【问题标题】:OnClick on webview in android?OnClick在android中的webview上?
【发布时间】:2015-01-14 15:06:08
【问题描述】:

我想像这样在 webView 上获得 Onclick 事件:

    webView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }
    });

【问题讨论】:

  • 好的。好的。有什么问题?
  • 很好!下一步是什么?
  • 问题是webView没有监听点击事件
  • 它只接受longClick

标签: java android events webview click


【解决方案1】:
    public class MyActivity extends Activity implements OnTouchListener{

    private float mDownPosX;
    private float mDownPosY;
    private float mUpPosX;
    private float mUpPosY;

    private WebView webView;

    private float MOVE_THRESHOLD_DP;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

         setContentView(R.layout.webview_layout);

         MOVE_THRESHOLD_DP = 20.0F * act.getResources().getDisplayMetrics().density;
         webView v = (WebView) findViewById(R.id.webView);
         v.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN:
            this.mDownPosX = event.getX();
            this.mDownPosY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            this.mUpPosX = event.getX();
            this.mUpPosY = event.getY();
            if ((Math.abs(mUpPosX - this.mDownPosX) < MOVE_THRESHOLD_DP) && (Math.abs(mUpPosY - this.mDownPosY) < MOVE_THRESHOLD_DP)) {
                //your click code here
            }

        break; 
        }
        return false; 
    }
    }

【讨论】:

    【解决方案2】:

    您的代码块在 web 视图中单击页面上的项目,但您可以使用 onTouchListener

    mWebView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_UP:
                    //ontouch
                    break;
            }
            return false;
        }
    });
    

    【讨论】:

    • 在文档中导航后,我无法获得 OnTouch 事件...:s
    • browser.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO 自动生成的方法存根 switch (event.getAction()) { case MotionEvent. ACTION_DOWN: { afficherButtons(); SessionVar.getInstance().setAfficherNextHTML(false); } case MotionEvent.ACTION_UP: { afficherButtons(); SessionVar.getInstance().setAfficherNextHTML(false); } //ontouch break; } return false; } });
    【解决方案3】:

    WebView 有唯一的 onTouchListener,不是 onClickListener,但是,你可以在 TouchListener 的帮助下创建自己的自定义 ClickListener,所以,我为 webView 创建了一个 CustomTouchListener,如下所示,

    public class WebViewTouchClickListener implements View.OnTouchListener {
    
        private static int MAX_CLICK_DURATION = 200;
        private static int MAX_CLICK_DISTANCE = 15;
        private long pressStartTime = 0;
        private float pressedX = 0;
        private float pressedY = 0;
        private boolean stayedWithinClickDistance = false;
        private Context context;
        private TouchClickCallBack touchClickCallBack;
    
    
        public WebViewTouchClickListener(Context context, TouchClickCallBack callback) {
            this.context = context;
            this.touchClickCallBack = callback;
        }
    
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    pressStartTime = System.currentTimeMillis();
                    pressedX = motionEvent.getX();
                    pressedY = motionEvent.getY();
                    stayedWithinClickDistance = true;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (stayedWithinClickDistance && distance(pressedX, pressedY, motionEvent.getX(), motionEvent.getY()) > MAX_CLICK_DISTANCE) {
                        stayedWithinClickDistance = false;
                    }
                    return true;
                case MotionEvent.ACTION_UP:
                    long pressDuration = System.currentTimeMillis() - pressStartTime;
                    if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) {
                        touchClickCallBack.isClicked();
                    }
            }
            return false;
        }
    
        private float distance(float x1, float y1, float x2, float y2) {
            double dx = x1 - x2;
            double dy = y1 - y2;
            double distanceInPx = Math.sqrt(dx * dx + dy * dy);
            double distanceInDp = distanceInPx / context.getResources().getDisplayMetrics().density;
            return (float) distanceInDp;
        }
    
        interface TouchClickCallBack {
            void isClicked();  //This interface method will give callback in activity or fragment were we want to use
        }
    }
    

    然后在activity中实现isClicked()方法来打开数据并传递如下值

    webView.setOnTouchListener(new WebViewTouchClickListener(context, new WebViewTouchClickListener.TouchClickCallBack {
        @Override                 
        void isClicked() {
                            //TODO: implement the method for doing the stuff based on web view click.
                    }))
    

    【讨论】:

      【解决方案4】:

      据我所知,您无法获得 webview 点击监听器。你可以使用它的 onTouchListener。

      This link详细阐述了如何处理这种情况

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多