2017-07-20 6 views
1

ViewGroupでイベントを処理するときに、どの子ビューがタッチされたのか判断できますか?

LinearLayoutA <-- I want to handle the touches here... 
    | 
    +-SomeViewX 
    +-SomeOtherViewY 
    +-LinearLayoutB 
     | 
     +-CustomView1 <-- for these three CustomView objects 
     +-CustomView2 
     +-CustomView3 

すると私は何をしたいのは手を触れた(壮大な)子ビューを知っているとLinearLayoutA内からそれを処理です...この仮想的な階層構造を考えてみましょう。また、私はこれらのビューを制御しないので、単に内部的にタッチを処理して親に代理することはできません。

現在、CustomViews 1-3に手動でタッチリスナーを追加していますが、これには多くの「定型文」が必要です。また、SomeViewXまたはSomeOtherViewYをクリックした場合に通知を受け取らないことを意味します。リスナーを添付しました。

C#やWPFなどの他の言語では、LinearLayoutAに相当するイベントを処理すると、イベントペイロードの一部がソースになりますが、これはタッチを開始したビューですが、わかりませんAndroidでのこのようなこと。

私が見たすべての例では、子供をループしてヒットテストし、重なりがある場合はzオーダーで曖昧さを取り除き、子供を特定したら、子供と繰り返し。

したがって、手動で繰り返しやヒットテストを行わずにViewGroup内のどの子がタッチされたのか、またはすべての子にリスナーを手作業で取り付けることなく、「Androidy」の方法がありますか?

+0

OnTouchListenerは、3つのオブジェクトすべてに対して同じリスナを使用し、引数を調べることでどれがヒットしたのかを知るために、 'View'をパラメータとして取り込みます。しかし、これは依然として手動で単一のリスナーを付加する必要があります。 –

+0

ええ、リスナーを手作業で取り付けるのは、私が避けようとしていたものでした。特に、それらのビューの一部が自分のコントロールの外や動的に作成されていたからです。だから私は正しかったということを意味します...デフォルトのイベント経路を使ってタップイベントのソースビューを知る方法はありませんか? – MarqueIV

+0

あなたはビューをコントロールしていないので、リスナーをどこかに付ける必要があると思いますが、単一の 'OnTouchListener'オブジェクトを再利用すると、比較的苦労するはずです。 –

答えて

0

ViewGroupのためOnTouchListenerはそのView引数ではなく、実際に触ったことView内の子としてViewGroupに渡します。レイアウト内のViewのソースを制御できないため、OnTouchListenerを手動で追加する必要があります。

私のコメントで述べたように、すべてのViewに同じリスナーをリスニングするには、それを聞きたいViewのそれぞれに付け加えることができます。これらを動的に追加する場合は、作成時に​​を呼び出すことも些細なことです。

詳細については、Android's guide to managing touch events in a ViewGroupを参照してください。これは、親が子供のタッチイベントを傍受する方法を提供しますが、その逆はできません。

+0

ええ、それは私が恐れていたものです。これは直接的な子どもたちにリスナーを追加するので機能しませんが、私が望むものは(偉大な)孫になる可能性があります。Windows上でのように、Androidは触れられたビューを爆発させないというのは残念です。ここでも、送信者(ViewGroup)がありますが、階層内のどこに関係なく、実際に触れられたビューであるソースがあります(上の誰もそれを処理していないことを前提としています)。 – MarqueIV

+0

直下の親を使用してリスナーを適用する必要はありません。あなたが追加している 'View'を受け取ったところでは、' setOnTouchListener() 'を呼び出し、それに' OnTouchListener'オブジェクトを渡してください。そのオブジェクトを実行中のアクティビティのどこにでも格納することができるので、階層内のどこに 'View'が行くかは関係ありません。 –

+0

私はここであなたに従っていません。自分自身がレイアウトを含むレイアウトを含むレイアウトを読み込んでいるとします。最も深いレイアウトでは、DrumPadsと呼ばれるコントロールを使用しています。どのDrumPadがクリックされたのかを知りたい。私はそれにハンドラを追加する必要がある場合、私はそれらに付着するために探しているすべての木を歩かなければならないでしょうか?あまりにも多く見えます。私は知っている...私は台無しだ。私はちょうどそれの下のすべてを聞く1つのリスナーを追加することに慣れています。 – MarqueIV

関連する問題