【问题标题】:How can I get onclick event on webview in android?如何在android的webview上获得onclick事件?
【发布时间】:2011-07-04 06:24:04
【问题描述】:

我想知道用户何时单击 webview 而不是超链接。在该单击上,我想显示/隐藏包含 web 视图的我的活动视图。有什么建议吗?

【问题讨论】:

标签: android android-webview


【解决方案1】:

我查看了这个,发现WebView 似乎没有将点击事件发送到OnClickListener。如果有人可以证明我错了或告诉我为什么,那么我很想听听。

我发现WebView 会将触摸事件发送到OnTouchListener。它确实有自己的onTouchEvent 方法,但我似乎只使用该方法获得MotionEvent.ACTION_MOVE

因此,鉴于我们可以在已注册的触摸事件侦听器上获取事件,剩下的唯一问题是当用户单击 URL 时如何规避您想要为触摸执行的任何操作。

这可以通过一些花哨的Handler 步法来实现,方法是发送延迟的触摸消息,然后如果触摸是由用户单击 URL 引起的,则删除这些触摸消息。

这是一个例子:

public class WebViewClicker extends Activity implements OnTouchListener, Handler.Callback {

private static final int CLICK_ON_WEBVIEW = 1;
private static final int CLICK_ON_URL = 2;

private final Handler handler = new Handler(this);

private WebView webView;
private WebViewClient client;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.web_view_clicker);
    
    webView = (WebView)findViewById(R.id.web);
    webView.setOnTouchListener(this);

    client = new WebViewClient(){ 
        @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { 
            handler.sendEmptyMessage(CLICK_ON_URL);
            return false;
        } 
    }; 
    
    webView.setWebViewClient(client);
    webView.setVerticalScrollBarEnabled(false);
    webView.loadUrl("http://www.example.com");
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (v.getId() == R.id.web && event.getAction() == MotionEvent.ACTION_DOWN){
        handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 500);
    }
    return false;
}

@Override
public boolean handleMessage(Message msg) {
    if (msg.what == CLICK_ON_URL){
        handler.removeMessages(CLICK_ON_WEBVIEW);
        return true;
    }
    if (msg.what == CLICK_ON_WEBVIEW){
        Toast.makeText(this, "WebView clicked", Toast.LENGTH_SHORT).show();
        return true;
    }
    return false;
}
}

【讨论】:

  • 谢谢你的时间。但是通过 onClick 将方法附加到正文的 javascript 接口呢?我使用它来工作。
  • 如果我们无法访问页面的 HTML 数据,您也是对的。或者,如果它是从网络加载的。谢谢。
  • 有什么方法可以控制 webview 包含吗?实际上,我想在 webview 上获取 youtube 视频的播放/暂停/停止/完成事件。我怎么能做到这一点?
  • 我不知道在这种情况下是否有任何区别,但应该注意的是 shouldOverrideUrlLoading() 可以在重定向期间调用,并不总是因为用户与链接交互。
  • C.d,可以通过将 ACTION_DOWN 替换为 ACTION_UP 来修复。我发现它在我的 ScrollView 中工作得更好。
【解决方案2】:

您可以通过 OnTouchListener 实现 OnClickListener:

webView.setOnTouchListener(new View.OnTouchListener() {

        public final static int FINGER_RELEASED = 0;
        public final static int FINGER_TOUCHED = 1;
        public final static int FINGER_DRAGGING = 2;
        public final static int FINGER_UNDEFINED = 3;

        private int fingerState = FINGER_RELEASED;


        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            switch (motionEvent.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                case MotionEvent.ACTION_UP:
                    if(fingerState != FINGER_DRAGGING) {
                        fingerState = FINGER_RELEASED;

                        // Your onClick codes

                    }
                    else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                case MotionEvent.ACTION_MOVE:
                    if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                default:
                    fingerState = FINGER_UNDEFINED;

            }

            return false;
        }
    });

【讨论】:

    【解决方案3】:

    Hamidreza's solution 几乎为我工作。

    我从实验中注意到,一个简单的点击通常有 2-5 个动作移动事件。检查动作上下动作之间的时间更简单,表现也更符合我的预期。

    private class CheckForClickTouchLister implements View.OnTouchListener {
        private final static long MAX_TOUCH_DURATION = 100;
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
    
            switch (event.getAction()) {
    
                case MotionEvent.ACTION_DOWN:
                    m_DownTime = event.getEventTime(); //init time
    
                    break;
    
                case MotionEvent.ACTION_UP:
                    if(event.getEventTime() - m_DownTime <= MAX_TOUCH_DURATION)
                        //On click action
    
                    break;
    
                default:
                    break; //No-Op
    
            }
            return false;
        }
    

    【讨论】:

    • 效果更好
    • 非常感谢,我花了几个小时才找到解决方案,而您的解决方案是唯一有效的。
    【解决方案4】:

    On Click 事件 On webView 在 onTouch 中的工作方式如下:

    imagewebViewNewsChart.setOnTouchListener(new View.OnTouchListener(){
    
      @Override   
      public boolean onTouch(View v, MotionEvent event) { 
        if (event.getAction()==MotionEvent.ACTION_MOVE){                        
           return false;     
        }
    
        if (event.getAction()==MotionEvent.ACTION_UP){    
            startActivity(new Intent(this,Example.class));                
    
        } 
    
        return false;                 
      }                       
    });
    

    【讨论】:

      【解决方案5】:

      我想你也可以使用 MotionEvent.ACTION_UP 状态,例如:

      @Override
      public boolean onTouch(View v, MotionEvent event) {
          switch (v.getId()) {
          case R.id.iv:
              if (event.getAction() == MotionEvent.ACTION_UP) {
                  if (isheadAndFootShow == false) {
                      headLayout.setVisibility(View.VISIBLE);
                      footLayout.setVisibility(View.VISIBLE);
                      isheadAndFootShow = true;
                  } else {
                      headLayout.setVisibility(View.INVISIBLE);
                      footLayout.setVisibility(View.INVISIBLE);
                      isheadAndFootShow = false;
                  }
                  return true;
              }
              break;
          }
      
          return false;
      }
      

      【讨论】:

        【解决方案6】:

        这对我有用

        webView.setOnTouchListener(new View.OnTouchListener() {
                                    @Override
                                    public boolean onTouch(View v, MotionEvent event) {
                                        // Do what you want
                                        return false;
                                    }
                                });
        

        【讨论】:

        • 伤心,但对我不起作用,仍然错过了 onClick 事件。
        • 也许你有另一个视图消耗触摸事件。
        • 如何再次启用点击事件,请先生帮助我,
        【解决方案7】:

        我已经尝试了几乎所有的答案,其中一些几乎对我有用,但这些答案都不是完美的。所以这是我的解决方案。对于此解决方案,您需要在 HTML 正文标记中添加 onclick 属性。因此,如果您无法修改 HTML 文件,那么此解决方案将不适合您。

        第 1 步: 在 HTML 正文标记中添加 onclick 属性,如下所示:

        <body onclick="ok.performClick(this.value);">
            <h1>This is heading 1</h1>
            <p>This is para 1</p>
        </body>
        

        第 2 步: 在您的应用中实现 addJavascriptInterface 来处理点击监听器:

        webView.addJavascriptInterface(new Object() {
            @JavascriptInterface
            public void performClick(String string) {
                handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 0);
            }
        }, "ok");
        

        第 3 步: 我们无法通过 performClick 方法对主线程执行任何操作,因此需要添加 Handler 类:

        private final Handler handler = new Handler(this); // class-level variable 
        private static final int CLICK_ON_WEBVIEW = 1; // class-level variable 
        

        在您的班级中实现Handler.Callback 并覆盖handleMessage

        @Override
        public boolean handleMessage(Message message) {
            if (message.what == CLICK_ON_WEBVIEW) {
                Toast.makeText(getActivity(), "WebView clicked", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
        

        【讨论】:

          【解决方案8】:

          WebViewClient.shouldOverrideUrlLoading 可能会有所帮助。我们的一个应用程序中有类似的要求。还没试过。

          【讨论】:

            【解决方案9】:

            那是因为它与 Web 视图而非按钮相关联。实施后我遇到了同样的问题。按钮没有影响,但 web 视图中的页面有影响。

            【讨论】:

              猜你喜欢
              • 2018-03-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-20
              • 2017-04-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多