为啥这个 MotionEvent 模拟不起作用?

Posted

技术标签:

【中文标题】为啥这个 MotionEvent 模拟不起作用?【英文标题】:Why doesn't this MotionEvent simulation work?为什么这个 MotionEvent 模拟不起作用? 【发布时间】:2011-07-12 03:21:27 【问题描述】:

在锻炼应用程序的一个视图中,我正在尝试以编程方式执行文本选择。

我能够(以编程方式)进入“文本选择模式”,该模式由视图左上角的 CursorControllers(AKA 句柄)直观地指示。

如果我手动拖动右侧的 CursorController,然后再次单击它(在模拟器中),它会按预期工作(完美),显示一条简短消息:“文本已复制到剪贴板”。

但是当我尝试以编程方式拖动正确的 CursorController 时,什么也没有发生。

我尝试这样做的方法是模拟 MotionEvent。在视图中,我调用:

  event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0);
  MainActivity.onTouch(this, event);

在 MainActivity 我当然要实现 OnTouchListener:

@Override
public boolean onTouch(View v, MotionEvent event)  // called BEFORE button's onTouchEvent()
    Log.v("MainActivity::onTouch()", describeEvent(v, event));
    switch (event.getAction())  
        case MotionEvent.ACTION_DOWN: 
        case MotionEvent.ACTION_UP: 
            if (!v.hasFocus())  
                v.requestFocus(); 
              
             break; 
     
    return false; 

如果我理解正确,仅仅从 onTouch 返回“false”,Android 会一直寻找另一个 UI 对象来使用 MotionEvent 对象,最终到达我的视图

为什么没有发生这种情况?

我一定遗漏了一些非常基本的东西......

【问题讨论】:

【参考方案1】:

OnTouchListener 在视图中从 dispatchTouchEvent 调用,而 dispatchTouchEvent 又从 ViewGroupTouchDelegate 调用。如果您从您的视图中调用侦听器,它只会执行您所拥有的一切,然后返回。它不会神奇地将触摸事件委托给任何地方。

请在您的视图上调用dispatchTouchEvent() 以获得正确的结果。

有关单元测试您的应用程序在文本选择等方面的行为。请参阅http://developer.android.com/resources/tutorials/testing/activity_test.html

【讨论】:

感谢第一个尝试回答这个难题的人。然而不幸的是,dispatchTouchEvent() 并没有产生人们渴望的事件。也许@DJC 对以下问题的回答是正确的:***.com/questions/5240287/…【参考方案2】:

由于缺乏可行的解决方案,我只能得出结论,出于安全原因,我一直试图完成的事情在 Android 上是不可能的。可以在以下链接中找到解释:How to send synthesized MotionEvent through the system?

【讨论】:

以上是关于为啥这个 MotionEvent 模拟不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

MotionEvent.ACTION_MOVE 在 Android 中不起作用

为啥离子中的WP rest API在模拟器中不起作用

不知道为啥我的自定义 UICollectionViewCell 不起作用?

为啥这个重定向不起作用?

为啥 FBLogin 在模拟器中不起作用? - 它留在 Safari 中?

为啥这个触发器不起作用?