How to pass a view's onClick event to its parent on Android?

I have a TextView in a layout whos background is a Selector. And the TextView's text is set to Spanned from HTML. Then I set the TextView with the LinkMovementMethod.

Now when I tap on the TextView, the click event is not sent to its parent layout to trigger the selector.

How should this be solved?

123815 次浏览

我认为你需要使用这些方法之一,以便能够拦截事件之前,它被发送到适当的组件:

Activity.dispatchTouchEvent(MotionEvent) - This allows your Activity to intercept all touch events before they are dispatched to the window.

ViewGroup.onInterceptTouchEvent(MotionEvent)-这允许 ViewGroup 在事件被发送到子视图时观察它们。

ViewParent.requestDisallowInterceptTouchEvent(boolean)-对父视图调用这个函数,以指示它不应该使用 onInterceptTouchEvent (MotionEvent)拦截触摸事件。

更多信息 给你

希望能帮上忙。

使用 android:clickable="false"android:focusable="false"或者 v.setClickable(false)v.setFocusable(false)声明你的 TextView不可点击/聚焦。点击事件现在应该发送到 TextView的父级。

注:

为了实现这个 ,您必须将 click 添加到它的直接 parent。或 set android:clickable="false"android:focusable="false"到它的直接母体 把听众传给下一代家长

有时只有这样才有帮助:

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);

放下

android:duplicateParentState="true"

然后视图从它的直接父级而不是从它自己获得它的可绘制状态(聚焦、按下等)。 您可以设置 onclick 的父和它调用子点击

如果您的 TextView创建单击问题,那么从 xml 文件中删除 android:inputType=""

如果你想让 OnTouchOnClick听众同时看到父母和子女,请使用以下技巧:

  1. 用户 ScrollView 作为父视图,并在其中将子视图放置在相对/线性布局中。

  2. Make Parent ScrollView android:fillViewport="true" so View not be scrolled.

  3. 然后将 OnTouch侦听器设置为父视图,将 OnClick侦听器设置为子视图。 并且享受两个听众的回复

This answer is similar to 亚历山大 · 乌科夫的回答, except that it uses touch events rather than click events. Those event allow the parent to display the proper pressed states (e.g., ripple effect). This answer is also in Kotlin instead of Java.

view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}

然后我用 LinkMovementMethod 设置 TextView。

TextView.setMovementMethod()在内部调用私有方法 fixFocusableAndClickableSettings。这是问题的根源: 调用 setFocusable(FOCUSABLE); setClickable(true); setLongClickable(true);。所以不管你认为你设置了什么样的可点击性,它都是真实的。

来源

这3个标志必须重新设置为 false,以使视图成为不可点击的。