我在一个布局中有一个TextView,它的背景是一个Selector。TextView的文本设置为从HTML中生成的Spanned。然后我使用LinkMovementMethod设置了TextView。
现在当我点击TextView时,点击事件不会发送到其父布局以触发Selector。
应该如何解决这个问题?
通过使用 android:clickable="false"
和 android:focusable="false"
或者 v.setClickable(false)
和 v.setFocusable(false)
来声明您的TextView
不可点击/聚焦。现在,点击事件应该会分发到TextView
的父级。
注意:
为了实现这一点,您需要将点击添加到其直接的parent
,或者将android:clickable="false"
和android:focusable="false"
设置到其直接parent
中,以便将监听器传递给更高一级的父级。
我认为你需要使用以下方法之一,以便在事件发送到适当的组件之前拦截它:
Activity.dispatchTouchEvent(MotionEvent)
- 这允许你的Activity在触摸事件被分派给窗口之前拦截所有触摸事件。
ViewGroup.onInterceptTouchEvent(MotionEvent)
- 这允许ViewGroup在事件被分派给子View之前查看事件。
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- 调用此方法可通知父View不要在onInterceptTouchEvent(MotionEvent)中拦截触摸事件。
更多信息请参见此处。
希望能帮到你。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
- Luis Miguel Serrano有时只有这个才能帮助:
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
允许父级显示触摸反馈(例如涟漪效果)。 - methodsignatureandroid:duplicateParentState="true"
在子视图中,它的可绘制状态(聚焦、按下等)取决于直接父视图而不是自身。你可以为父视图设置onclick事件,并通过它来调用子视图上的点击事件。
android:inputType="none"
。 - AZ_android:inputType="textCapWords"
。 - Nil这个答案与Alexander Ukhov的答案相似,只不过它使用了触摸事件而不是点击事件。这些事件使得父元素能够显示正确的按下状态(例如涟漪效果)。此答案还使用了Kotlin而非Java。
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}
将ScrollView作为父视图,并在其中放置你的子视图(在Relative/LinearLayout中)。
将父ScrollView设置为android:fillViewport="true",这样视图就不会滚动。
然后将OnTouch监听器设置给父视图,并将OnClick监听器设置给子视图。 然后就可以同时享受两个监听器的回调了。
TextView#setOnClickListener()
方法,即使它被声明为android:clickable="false"
,甚至即使将ClickListener
设置为null
(setOnclickListener(null)
),它也会变得可点击。 - Christian Garcíaandroid:inputType
属性,即使clickable:false和focusable:false,它也会悄悄地消耗点击事件;在我的情况下,它是在样式中设置的,这让我花了30分钟才找出原因。 - Kirill Karmazin