回答:
イベントが適切なコンポーネントに送信される前にインターセプトできるようにするには、これらのメソッドのいずれかを使用する必要があると思います。
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
ビューに、リスナーを子ビューに設定します。そして、両方のリスナーコールバックをお楽しみください。