我需要模拟单击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);
}
}