2011-03-09 105 views
6

在練習應用程序中的一個視圖中,我嘗試以編程方式執行文本選擇。爲什麼MotionEvent仿真不能工作?

我能夠(以編程方式)輸入「文本選擇模式」,它由視圖左上角的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,的Android不斷尋找另UI對象消耗MotionEvent對象,最終到達我的視圖

爲什麼不會發生這種情況?

我必須失去了一些非常基本的...

回答

0

OnTouchListener被稱爲視圖從dispatchTouchEvent這反過來已經從ViewGroupTouchDelegate稱爲內。如果你從視圖中調用監聽器,它只會做你在那裏的任何事情,然後返回。它不會神奇地將觸摸事件委託給任何地方。

請在您的視圖中調用dispatchTouchEvent()以獲得正確的結果。

進行單元測試的文本選擇等應用程序的行爲見http://developer.android.com/resources/tutorials/testing/activity_test.html

+0

成爲第一個嘗試回答這個難題的人的榮譽。然而,不幸的是,dispatchTouchEvent()並不會對事件產生多大的期望。也許@DJC在他對以下問題的回答中是正確的:http://stackoverflow.com/questions/5240287/how-to-send-synthesized-motionevent-through-the-system – 2011-03-13 16:21:40