6

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

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

为什么这不会发生?

我一定错过了一些非常基本的东西......

4

2 回答 2

1

由于缺乏可行的解决方案,我只能得出结论,出于安全原因,我一直试图完成的事情在 Android 上是不可能的。可以在以下链接中找到解释:如何通过系统发送合成的 MotionEvent?

于 2011-03-22T16:29:54.810 回答
0

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

而是调用dispatchTouchEvent()您的视图以获得正确的结果。

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

于 2011-03-12T20:32:36.313 回答