回答:
イベントが適切なコンポーネントに送信される前にインターセプトできるようにするには、これらのメソッドのいずれかを使用する必要があると思います。
Activity.dispatchTouchEvent(MotionEvent) -これにより、アクティビティがウィンドウにディスパッチされる前に、すべてのタッチイベントをインターセプトできます。
ViewGroup.onInterceptTouchEvent(MotionEvent) -これにより、ViewGroupは、子ビューにディスパッチされるときにイベントを監視できます。
ViewParent.requestDisallowInterceptTouchEvent(boolean) -onInterceptTouchEvent(MotionEvent)でタッチイベントをインターセプトしないことを示すために、親ビューでこれを呼び出します。
詳細はこちら。
お役に立てば幸いです。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
and およびandおよびTextViewを使用してandroid:clickable="false"、クリック不可/フォーカス可能を宣言します。これで、クリックイベントがの親にディスパッチされます。android:focusable="false"v.setClickable(false)v.setFocusable(false)TextView
注意:
これを達成するには、直接にクリックを追加する必要がありますparent。またはandroid:clickable="false"、リスナーを別の親に渡すandroid:focusable="false"には、その直接の親に設定
します。
TextView#setOnClickListener()はTextView、で使用すると、として宣言されandroid:clickable="false"ていても、ClickListenerがnull(setOnclickListener(null))に設定されていてもクリック可能になるということです
android:inputType属性がある場合、clickable :false&focusable:false;でも、静かにクリックイベントを消費します。私の場合、それはスタイルで設定され、原因を解明するのに30分かかりました。
時々これだけが役立ちます:
View child = parent.findViewById(R.id.btnMoreText);
child.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View) v.getParent();
parent.performClick();
}
});
別のバリアントは、常に機能するとは限りません:
child.setOnClickListener(null);
CardViewているので、子ビューとしてCardView無視しているようだclickable="false"とfocusable="false"。ただし、親を使用setOnTouchListenerして呼び出すことonTouchEventで、代わりに親がタッチフィードバック(リップル効果など)を表示できるようになります。
TextViewクリックに関する問題が発生した場合android:inputType=""は、xmlファイルから削除してください。
android:inputType="none"
この回答は、クリックイベントではなくタッチイベントを使用することを除いて、アレクサンダーウホフの回答に似ています。これらのイベントにより、親は適切な押された状態(たとえば、波及効果)を表示できます。この答えは、JavaではなくKotlinにもあります。
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}
両方OnTouchとOnClickリスナーの親と子の両方を表示したい場合は、以下のトリックを使用してください:
親ビューとしてのユーザーScrollView、および子ビューをRelative / LinearLayout内に配置したユーザーScrollView。
親ScrollViewを作成してandroid:fillViewport="true"、ビューがスクロールされないようにします。
次に、OnTouchリスナーを親OnClickビューに、リスナーを子ビューに設定します。そして、両方のリスナーコールバックをお楽しみください。