模拟鼠标点击时,WebView GetHitTestResult()显示上一个节点

时间:2016-04-29 04:32:46

标签: android xamarin.android android-webview motionevent

我需要模拟单击Android WebView中HTML页面中的节点,然后记录单击了哪个节点。但是,当我在我的子类WebView中从GetHitTestResult调用OnTouchEvent时,它不会显示刚刚点击的节点,而是显示之前单击的节点这个点击。 (即:从选择的编辑节点开始,然后假冒点击Image1.png,GetHitTestResult中的OnTouchEvent显示原始编辑节点而不是“Image1”。如果您然后单击Image2。 png,GetHitTestResult显示“Image1”。然后点击其他内容并显示“Image2”。)

实际鼠标点击显示正确的节点 - 只是通过我的模拟点击GetHitTestResult显示错误的节点。 (在实际鼠标点击时,“向下”事件显示上一个节点,但“向上”事件显示当前/正确的节点。)不幸的是,我对大多数网页没有任何控制权,所以我只能这样做从我的日志代码中检测节点。

我是否需要在模拟的“向下”点击和模拟的“向上”点击之间调用某些东西,以便Android / Xamarin / WebView小部件识别节点更改? (顺便说一下:这是在Xamarin.Android中。)或者Android中是否有任何方法可以强制它处理UI线程中可能仍未处理的任何未完成的DispatchTouchEvent事件? (也许这个问题是由假的“向下”点击和虚假的“向上”点击之间尚未处理的东西引起的?)

C#点击代码:

void ClickThePage(WebView webView, float left, float top) {

    long downTime = Android.OS.SystemClock.UptimeMillis();
    long eventTime = Android.OS.SystemClock.UptimeMillis() + 100;
    MotionEvent motionEventDown = MotionEvent.Obtain(
        downTime, eventTime, MotionEventActions.Down,
        left, top, (MetaKeyStates)0x0
    );

    downTime = Android.OS.SystemClock.UptimeMillis() + 200;
    eventTime = Android.OS.SystemClock.UptimeMillis() + 300;
    MotionEvent motionEventUp = MotionEvent.Obtain(
        downTime, eventTime, MotionEventActions.Down,
        left, top, (MetaKeyStates)0x0
    );

    // actually do the "Click"
    webView.DispatchTouchEvent (motionEventDown);
    System.Threading.Thread.Sleep (50);
    webView.DispatchTouchEvent (motionEventUp);

    motionEventDown.Recycle ();
    motionEventUp.Recycle ();
}

点击捕获代码:

public class SAWebView : WebView {
    ...
    public override bool OnTouchEvent (MotionEvent e) {
        Console.WriteLine("[SAWebView]: OnTouchEvent: Action = " + e.Action + 
            "\n HitTestResult.Type = " + GetHitTestResult().Type +
            "\n HitTestResult.Extra = " + GetHitTestResult().Extra);
        return base.OnTouchEvent (e);
    }
}

0 个答案:

没有答案