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
视图,将侦听器设置为子视图。并享受两个监听器回调。