implement - ontouch android event



子ビューでOnTouchEventが機能しない (4)

私はそれにボタンとTextViewを持っているリニアレイアウトを持っています。 私はそのアクティビティに対してOnTouchEventを書いています。 画面上をタッチするとコードは正常に機能しますが、ボタンをタッチするとコードが機能しません。 これにはどのような解決策がありますか?

public boolean onTouchEvent(MotionEvent event) {
   int eventaction=event.getAction();


   switch(eventaction)
   {
   case MotionEvent.ACTION_MOVE:
      reg.setText("hey");


   break;
   }
   return true;

  }

https://src-bin.com


Answer #1

@Devunwiredによるこの優れた投稿にもう一度コメントを追加しましょう。

あなたのビューにonTouchListenerも設定していれば、そのonTouch()メソッドはディスパッチメソッドの後に呼び出されますが、onTouchEvent()メソッドの前、つまり@ Devunwiredの答えのno.3とno.4の間で呼び出されます。


Answer #2

Activity::onTouchEventは、アクティビティWIndow内のビューのうちのどれもがイベントを消費/処理しない場合にのみ呼び出されます。 Buttonに触れると、 Buttonはイベントを消費するので、アクティビティはそれを処理できません。

Android Touchイベント処理パイプラインの詳細については、以下の記事をご覧ください。

http://pierrchen.blogspot.jp/2014/03/pipeline-of-android-touch-event-handling.html


Answer #3

レイアウトのdescendantFocusability属性をblocksDescendantsに設定してみてください


Answer #4

問題は、Androidがタッチイベントを処理する方法の操作の順序です。 各タッチイベントは、(簡略化された例)のパターンに従います。

  1. Activity.dispatchTouchEvent()
  2. ViewGroup.dispatchTouchEvent()
  3. View.dispatchTouchEvent()
  4. View.onTouchEvent()
  5. ViewGroup.onTouchEvent()
  6. Activity.onTouchEvent()

しかし、イベントはチェーンが消費されるまで続きます(つまり、誰かがonTouchEvent()またはリスナーからtrueを返す)ことを意味します。 画面上のどこかに触れるだけで、誰もそのイベントに興味がないので、コードに至るまで流れています。 しかし、ボタン(または他のクリック可能なView )の場合、それは興味があるのでタッチイベントを消費するので、フローは4行目で停止します。

アクティビティに入るすべての接触を監視したい場合は、 dispatchTouchEvent()をオーバーライドする必要があります。これは、常に最初にonTouchEvent()れたイベントからonTouchEvent()が最後に呼び出され、他の誰もイベントを取得していない場合に限ります。 ただし、ここでイベントを消費しないように注意してください。そうしないと、子ビューには表示されず、ボタンがクリックできなくなります。

public boolean dispatchTouchEvent(MotionEvent event) {
   int eventaction=event.getAction();

    switch(eventaction) {
      case MotionEvent.ACTION_MOVE:
          reg.setText("hey");
          break;
      default:
          break;
    }

    return super.dispatchTouchEvent(event);
}

もう一つの選択肢は、あなたのタッチ操作コードを( ViewGroupような)カスタムViewGroupに入れ、そのonInterceptTouchEvent()メソッドを使用して親ビューがonInterceptTouchEvent() 、必要に応じてタッチイベントを処理できるようにすることです。 しかし、この相互作用は新しいタッチイベントが始まるまで元に戻せないものです(一度あなたが1つのイベントを盗むと、それらをすべて盗むことになります)。

HTH





ontouchlistener