Android onTouchEvent和JavaScript onclick事件
[修订版] 我确实做到了,但我不确定这是正确的方法。欢迎评论 在WebView中的Android onTouchEvent和JavaScript onclick事件,android,Android,[修订版] 我确实做到了,但我不确定这是正确的方法。欢迎评论 在WebView中的onTouchEvent中,我将事件传递给super,并返回true(这可以防止事件进一步传播,并允许JavaScript执行其任务)。但是在返回之前,我还将事件定向到父容器的onTouchEvent——但是我必须将容器强制转换为具有onTouchEvent的类,或者指定一个接口。在我的例子中,WebView的onTouchEvent现在看起来如下: @Override public boolean onTouch
onTouchEvent
中,我将事件传递给super
,并返回true
(这可以防止事件进一步传播,并允许JavaScript执行其任务)。但是在返回之前,我还将事件定向到父容器的onTouchEvent
——但是我必须将容器强制转换为具有onTouchEvent
的类,或者指定一个接口。在我的例子中,WebView的onTouchEvent
现在看起来如下:
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
((RelativeLayout)getParent()).onTouchEvent(ev);
return true;
}
这是可行的,但这是一个正确的解决方案吗
我不知道如何让Android Webview通过HTML页面(通过JavaScript)和应用程序的其余部分“共享”触摸事件。从我看到的情况来看,JavaScript或WebView的父母都可以看到触摸,但不是两者都可以。有人知道附近的工作吗 下面是一个使用活动(TestActivity.java)、RelativeLayout(TestLayout.java)和WebView(TestWebView.java)的工作示例。WebView有一个
onTouchEvent
(声明触摸事件是否已被处理)和一个简单的HTML页面。检测到触摸事件的地方有三个:
在
周围单击一个
——如果你触摸它,页面会变为彩色
onTouch
返回true
(表示它“处理”了事件),JSonclick
会工作(页面颜色会改变),但是父对象的onTouchEvent
永远不会到达(这是您所期望的)。如果WebView的onTouchEvent
返回'false',则调用父级的onTouchEvent
,但JS从未接收到该事件(奇怪的是,单词周围会出现一个框,表示它已被触摸,但JS从未执行)
TestActivity.java
package com.scriptfoundry.LinkTest;
import android.app.Activity;
import android.os.Bundle;
public class LinkTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TestLayout layout = new TestLayout(this);
TestWebView webView = new TestWebView(this);
layout.addView(webView);
setContentView(layout);
}
}
TestLayout.java:
package com.scriptfoundry.LinkTest;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.RelativeLayout;
public class TestLayout extends RelativeLayout {
public TestLayout(Context context) {
super(context);
setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
setBackgroundColor(Color.LTGRAY);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.d("Info","TestLayout onTouchEvent invoked");
return false;
}
}
TestWebView.java:
package com.scriptfoundry.LinkTest;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.util.Xml.Encoding;
import android.view.MotionEvent;
import android.webkit.WebView;
import android.widget.RelativeLayout;
public class TestWebView extends WebView {
public TestWebView(Context context) {
super(context);
setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.FILL_PARENT));
setBackgroundColor(Color.WHITE);
getSettings().setJavaScriptEnabled(true);
loadData("<html><head></head><body><h1 onclick=\"document.body.style.backgroundColor=document.body.style.backgroundColor==='red'?'blue':'red'\">Change colour</h1><body></html>","text/html",Encoding.UTF_8.toString());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.d("Info","TestWebView onTouchEvent invoked");
super.onTouchEvent(ev);
return false;
}
}
package com.scriptfoundry.LinkTest;
导入android.content.Context;
导入android.graphics.Color;
导入android.util.Log;
导入android.util.Xml.Encoding;
导入android.view.MotionEvent;
导入android.webkit.WebView;
导入android.widget.RelativeLayout;
公共类TestWebView扩展了WebView{
公共TestWebView(上下文){
超级(上下文);
setLayoutParams(新的RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_父级,RelativeLayout.LayoutParams.FILL_父级));
setBackgroundColor(颜色:白色);
getSettings().setJavaScriptEnabled(true);
loadData(“更改颜色”、“文本/html”、Encoding.UTF_8.toString());
}
@凌驾
公共事件(MotionEvent ev){
Log.d(“Info”,“调用TestWebView onTouchEvent”);
超级火山口(ev);
返回false;
}
}