为什么MotionEvent模拟不起作用?

时间:2011-03-09 18:17:01

标签: android events touch textselection

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

我能够(以编程方式)输入“文本选择模式”,它由视图左上角的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对象,最终到达我的视图

为什么不发生这种情况?

我必须遗漏一些非常基本的东西......

2 个答案:

答案 0 :(得分:1)

由于缺乏可行的解决方案,我只能得出结论,出于安全考虑,我在Android上无法实现的目标是不可能的。可以在以下链接中找到解释:How to send synthesized MotionEvent through the system?

答案 1 :(得分:0)

OnTouchListener在来自dispatchTouchEvent的视图中调用ViewGroup,后者又从TouchDelegatedispatchTouchEvent()调用。如果您从视图中调用侦听器,它只会执行您所拥有的操作然后返回。它并不会将触摸事件神奇地委托给任何地方。

而是在视图上调用{{1}}以获得正确的结果。

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