31

Button と TextView を持つ Linear Layout があります。アクティビティの OnTouchEvent を作成しました。画面をタッチするとコードは正常に機能しますが、ボタンをタッチするとコードが機能しません。これに対する可能な解決策は何ですか?

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


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


   break;
   }
   return true;

  }
4

7 に答える 7

105

問題は、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()ただし、ここでイベントを消費しないように注意してください。そうしないと、子ビューがイベントを取得できず、ボタンをクリックできなくなります。

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);
}

もう 1 つのオプションは、タッチ処理コードをカスタムViewGroup( などLinearLayout) に配置し、そのonInterceptTouchEvent()メソッドを使用して、必要に応じて親ビューが離れてタッチ イベントを処理できるようにすることです。ただし、この操作は新しいタッチ イベントが開始されるまで元に戻すことができないため、注意してください (1 つのイベントを盗むと、すべてを盗むことになります)。

HTH

于 2012-06-12T17:09:24.263 に答える
4

@Devunwired によるこの優れた投稿に、もう 1 つコメントを追加さ​​せてください。

ビューに onTouchListener も設定した場合、その onTouch() メソッドはディスパッチ メソッドの後、ただし onTouchEvent() メソッドの前、つまり @Devunwired の回答の 3 番と 4 番の間に呼び出されます。

于 2014-01-16T14:39:42.400 に答える
1

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

于 2012-06-12T17:01:47.703 に答える
0

Activity::onTouchEventActivity WINdow のビューがイベントを消費/処理しない場合にのみ呼び出されます。をタッチするButtonと、Buttonがイベントを消費するため、Activity はそれを処理できません。

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

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

于 2014-03-09T03:12:21.747 に答える
0

あなたも試すことができますonUserInteraction()

@Override 
public void onUserInteraction(){
     //your code here
     super.onUserInteraction();
}

私にとってはうまくいきます!

于 2016-10-27T09:09:08.093 に答える
0

public boolean dispatchTouchEvent(MotionEvent event)代わりに使用onTouchEvent()

于 2018-10-12T14:12:48.090 に答える