Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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 onTouchEvent和JavaScript onclick事件_Android - Fatal编程技术网

Android onTouchEvent和JavaScript onclick事件

Android onTouchEvent和JavaScript onclick事件,android,Android,[修订版] 我确实做到了,但我不确定这是正确的方法。欢迎评论 在WebView中的onTouchEvent中,我将事件传递给super,并返回true(这可以防止事件进一步传播,并允许JavaScript执行其任务)。但是在返回之前,我还将事件定向到父容器的onTouchEvent——但是我必须将容器强制转换为具有onTouchEvent的类,或者指定一个接口。在我的例子中,WebView的onTouchEvent现在看起来如下: @Override public boolean onTouch

[修订版]

我确实做到了,但我不确定这是正确的方法。欢迎评论

在WebView中的
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页面。检测到触摸事件的地方有三个:

  • HTML页面(通过
    周围单击一个
    ——如果你触摸它,页面会变为彩色
  • WebView的onTouchEvent——如果您触摸它,就会记录一条消息
  • 布局的onTouchEvent——如果您触摸它,将记录另一条消息
  • 如果WebView的
    onTouch
    返回
    true
    (表示它“处理”了事件),JS
    onclick
    会工作(页面颜色会改变),但是父对象的
    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;
    }
    }