Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't this MotionEvent simulation work?

In one of the views in an exercise app, am trying to perform text selection programmatically.

I am able to (programmatically) enter "text selection mode", which is visually indicated by CursorControllers (AKA handles) on the top-left corner of the view.

If I manually drag the right CursorController, then click it again (in the emulator), it works as expected (perfectly), showing a brief message: "Text copied to clipboard".

But when I try to programmatically drag that right CursorController, nothing happens.

The way I try to do this is by simulating a MotionEvent. In the view, I call:

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

In the MainActivity I of course implement 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; 
}

If I understand correctly, by mere returning 'false' from onTouch, Android keeps looking for another UI object to consume the MotionEvent object, eventually reaching my view.

Why doesn't this happen?

I must be missing something very fundamental...

like image 885
Regex Rookie Avatar asked Mar 09 '11 18:03

Regex Rookie


1 Answers

For lack of a working solution, I can only conclude that what I have been trying to accomplish isn't possible on the Android, for reasons of security. An explanation can be found in the following link: How to send synthesized MotionEvent through the system?

like image 163
Regex Rookie Avatar answered Nov 03 '22 12:11

Regex Rookie