小编Mil*_*ský的帖子

检查Android WebView是否正在使用触摸事件

精简版

如何检测Android WebView是否消耗了触摸事件?onTouchEvent始终返回true和WebViewClientonUnhandledInputEvent永远不会触发.

详细版本

我在TwoDScrollView中有多个WebView.顾名思义,TwoDScrollView可以垂直和水平滚动.TwoDScrollView的内容可以放大/缩小.当用户拖动手指或使用双指缩放时,我想将触摸事件发送到:

  • WebView,如果其内容可滚动/可缩放(即只有WebView内部将滚动/缩放)
  • 如果上述条件为false,则为TwoDScrollView(TwoDScrollView的所有内容都将滚动/缩放)

我通过使用canScrollHorizontallycanScrollVertically方法部分实现了这一点.但这些方法仅适用于"原生滚动".但是,在某些情况下,WebView中的某些JavaScript会消耗触摸事件,例如Google Maps.在这种情况下,方法返回false.有没有办法找出WebView的内容是否消耗触摸事件,即可滚动/可缩放?我无法更改WebView的内容,因此我的问题与不同.

我已经考虑通过evaluateJavaScript方法在Webview中执行一些JavaScript来检查触摸处理程序,但根据这个答案,没有简单的方法来实现这一点,并且页面也可以有一些其他嵌套的iframe.任何帮助将不胜感激.

我已经尝试过的

  1. 无论如何,我都会覆盖WebView onTouchEvent并读取super.onTouchEvent()哪些内容始终返回true.
  2. canScrollHorizontallycanScrollVertically如上所述,只能部分解决这个问题
  3. onScrollChanged 也没用
  4. WebViewClient.onUnhandledInputEvent 永远不会被触发
  5. 我考虑过使用JavaScript evaluateJavaScript,但这是一个非常复杂和丑陋的解决方案
  6. 我试图跟踪MotionEvent Debug.startMethodTracing.我发现它传播如下:
    • android.webkit.WebView.onTouchEvent
    • com.android.webview.chromium.WebViewChromium.onTouchEvent
    • com.android.org.chromium.android_webview.AwContents.onTouchEvent
    • com.android.org.chromium.android_webview.AwContents$AwViewMethodsImpl.onTouchEvent
    • com.android.org.chromium.content.browser.ContentViewCore.onTouchEventImpl
    • 根据ContentViewCore的源代码,触摸事件以本机方式结束nativeOnTouchEvent,我不知道它会发生什么.无论如何,onTouchEvent总是返回true,即使有可能在某处发现事件是否被消耗,它也需要使用非常丑陋的私有方法.

注意

我不需要知道如何拦截发送到WebView的触摸事件,但WebView是否正在使用它们,即是否正在使用它们执行任何操作,例如滚动,拖动等.

android webview

59
推荐指数
1
解决办法
1万
查看次数

验证者由于方法错误而拒绝了Lambda

在一个Android项目中,我尝试使用Java 8的新lambda功能,因此我将现有的可运行功能的匿名内部类修改为lambda。但是,使用以下错误消息执行代码时,应用程序崩溃:

11-25 11:20:33.485 27105-27105/com.infor.Dashboards.dev E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.infor.Dashboards.dev, PID: 27105
java.lang.VerifyError: Verifier rejected class com.infor.Dashboards.Settings.DebugTestingFragment$3$1$$Lambda$-void_onPostExecute_java_lang_String_string_LambdaImpl0 due to bad method void com.infor.Dashboards.Settings.DebugTestingFragment$3$1$$Lambda$-void_onPostExecute_java_lang_String_string_LambdaImpl0.processMessage(android.os.Message) (declaration of 'com.infor.Dashboards.Settings.DebugTestingFragment$3$1$$Lambda$-void_onPostExecute_java_lang_String_string_LambdaImpl0' appears in /data/app/com.infor.Dashboards.dev-1/base.apk)
    at com.infor.Dashboards.Settings.DebugTestingFragment$3$1.onPostExecute(DebugTestingFragment.java:308)
    at com.infor.Dashboards.Settings.DebugTestingFragment$3$1.onPostExecute(DebugTestingFragment.java:304)
    at android.os.AsyncTask.finish(AsyncTask.java:651)
    at android.os.AsyncTask.-wrap1(AsyncTask.java)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5460)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)

这是示例代码(单击按钮时应用崩溃):

view.findViewById(R.id.test_code).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        new AsyncTask<Void, Void, String>() {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void …
Run Code Online (Sandbox Code Playgroud)

lambda android anonymous-class inner-classes java-8

5
推荐指数
0
解决办法
527
查看次数