Answers:
我认为您需要使用这些方法之一,以便能够在事件发送到适当的组件之前对其进行拦截:
Activity.dispatchTouchEvent(MotionEvent) -这使您的活动可以在所有触摸事件被分派到窗口之前拦截它们。
ViewGroup.onInterceptTouchEvent(MotionEvent) -这允许ViewGroup在将事件调度到子View时监视它们。
ViewParent.requestDisallowInterceptTouchEvent(boolean) -在父视图上调用此方法,以指示它不应使用onInterceptTouchEvent(MotionEvent)拦截触摸事件。
更多信息在这里。
希望能有所帮助。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
TextView使用android:clickable="false"和android:focusable="false"或v.setClickable(false)和声明您不可点击/不能聚焦的内容v.setFocusable(false)。点击事件应立即发送到TextView的父级。
注意:
为了实现这一点,您必须在其直接栏中添加click parent。或者设置
android:clickable="false"和android:focusable="false"其直接父传听众进一步父。
TextView#setOnClickListener()的TextView,就变成可点击的,即使它被声明为android:clickable="false",而且即使在ClickListener设置为null(setOnclickListener(null))
android:inputType属性,即使使用clickable:false和focusable:false,它也会以静默方式使用click事件。在我的情况下,它设置为一种样式,花了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父级可以让父级显示触摸反馈(例如波纹效果)。
放
android:duplicateParentState="true"
在子级中,视图从其直接父级而不是其自身获得其可绘制状态(聚焦,按下等)。您可以为父级设置onclick,然后调用被点击的子级
如果您的TextView创建点击问题,那么请android:inputType=""从xml文件中删除。
android:inputType="none"
该答案与Alexander Ukhov的答案类似,不同的是它使用触摸事件而不是单击事件。这些事件允许父母显示适当的按下状态(例如,涟漪效应)。这个答案也在Kotlin中而不是Java中。
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}
如果你既想OnTouch和OnClick听众对父母和孩子两个视,请使用以下技巧:
用户ScrollView作为父视图,并在其中将子视图放置在Relative / LinearLayout中。
将Parent设置为ScrollView,android:fillViewport="true"以使View不会滚动。
然后将OnTouch侦听器设置为父OnClick视图,将侦听器设置为子视图。并享受两个监听器回调。