6

エクササイズアプリのビューの1つで、プログラムでテキスト選択を実行しようとしています。

ビューの左上隅にあるCursorControllers(別名ハンドル)によって視覚的に示される「テキスト選択モード」に(プログラムで)入ることができます。

右の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はMotionEventオブジェクトを消費する別のUIオブジェクトを探し続け、最終的に私のビューに到達します

なぜこれが起こらないのですか?

私は非常に基本的な何かを見逃しているに違いありません...

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 に答える