如何在android的webview上获取onclick事件?
我想知道用户何时单击webview而不是超链接。单击后,我想显示/隐藏包含网络视图的活动视图。有什么建议吗?我查看了一下,发现如何在android的webview上获取onclick事件?,android,android-webview,Android,Android Webview,我想知道用户何时单击webview而不是超链接。单击后,我想显示/隐藏包含网络视图的活动视图。有什么建议吗?我查看了一下,发现WebView似乎不会将单击事件发送到OnClickListener。如果有人能证明我错了,或者告诉我为什么,那么我很想听听 我发现WebView会将触摸事件发送给OnTouchListener。它确实有自己的onTouchEvent方法,但我似乎只使用该方法获得了MotionEvent.ACTION\u MOVE 因此,考虑到我们可以在已注册的触摸事件侦听器上获取事件,
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事件仍然会丢失。也许你有一个使用触摸事件的其他视图。如何再次启用单击事件请帮助我,先生,效果更好谢谢您,我花了几个小时找到了解决方案,而您的是唯一真正有效的解决方案。