Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android的webview上获取onclick事件?_Android_Android Webview - Fatal编程技术网

如何在android的webview上获取onclick事件?

如何在android的webview上获取onclick事件?,android,android-webview,Android,Android Webview,我想知道用户何时单击webview而不是超链接。单击后,我想显示/隐藏包含网络视图的活动视图。有什么建议吗?我查看了一下,发现WebView似乎不会将单击事件发送到OnClickListener。如果有人能证明我错了,或者告诉我为什么,那么我很想听听 我发现WebView会将触摸事件发送给OnTouchListener。它确实有自己的onTouchEvent方法,但我似乎只使用该方法获得了MotionEvent.ACTION\u MOVE 因此,考虑到我们可以在已注册的触摸事件侦听器上获取事件,

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

我查看了一下,发现
WebView
似乎不会将单击事件发送到
OnClickListener
。如果有人能证明我错了,或者告诉我为什么,那么我很想听听

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

因此,考虑到我们可以在已注册的触摸事件侦听器上获取事件,剩下的唯一问题是,当用户单击URL时,如何规避您希望对触摸执行的任何操作

这可以通过一些花哨的
处理程序
步法来实现,方法是发送一条延迟的触摸信息,然后在用户单击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;
}
}


希望这有帮助。

您可以通过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;
        }
    });

我认为您也可以使用MotionEvent.ACTION\u UP state,例如:

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

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

这对我很有效

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

这是因为它绑定到web视图,而不是按钮。实施后我也遇到了同样的问题。按钮没有影响,但web视图中的页面有影响。

几乎对我有效

我从实验中注意到,一个简单的点击通常有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;
    }
ClickTouchLister的私有类检查实现View.OnTouchLister{
私人最终静态长最大触摸持续时间=100;
@凌驾
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
m_DownTime=event.getEventTime();//初始化时间
打破
case MotionEvent.ACTION\u UP:

如果webView上单击事件时的(event.getEventTime()-m_down在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;                 
  }                       
});
<body onclick="ok.performClick(this.value);">
    <h1>This is heading 1</h1>
    <p>This is para 1</p>
</body>

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

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

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;                 
  }                       
});
<body onclick="ok.performClick(this.value);">
    <h1>This is heading 1</h1>
    <p>This is para 1</p>
</body>
第3步:我们无法从
performClick
方法对主线程执行任何操作,因此需要添加
处理程序
类:

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

谢谢你的时间。但是如果一个javascript界面有一个通过onClick连接到body的方法呢…我用它来工作。如果我们无法访问页面的HTML数据,或者它是从web加载的,那么你也是对的。谢谢。有没有办法控制webview contain?实际上我想得到你的play/pause/stop/complete事件webview上的utube视频。我如何才能做到这一点?我不知道它在这种情况下是否有任何区别,但应该注意的是,应该重写eurlloding()可以在重定向过程中调用,并不总是因为用户与链接的交互。C.d,可以通过将ACTION_向下替换为ACTION_向上来修复。我发现它在我的ScrollView中工作得更好。嘿,Arslan,你有可以发布或链接到的示例吗?很遗憾,但对我不起作用,onClick事件仍然会丢失。也许你有一个使用触摸事件的其他视图。如何再次启用单击事件请帮助我,先生,效果更好谢谢您,我花了几个小时找到了解决方案,而您的是唯一真正有效的解决方案。