【发布时间】:2010-12-11 06:29:40
【问题描述】:
我的布局中有一个 TextView,其背景是一个选择器。并且 TextView 的文本设置为从 HTML 跨越。 然后我用 LinkMovementMethod 设置 TextView。
现在当我点击 TextView 时,点击事件不会发送到其父布局以触发选择器。
应该如何解决?
【问题讨论】:
标签: android events onclick textview
我的布局中有一个 TextView,其背景是一个选择器。并且 TextView 的文本设置为从 HTML 跨越。 然后我用 LinkMovementMethod 设置 TextView。
现在当我点击 TextView 时,点击事件不会发送到其父布局以触发选择器。
应该如何解决?
【问题讨论】:
标签: android events onclick textview
使用android:clickable="false" 和android:focusable="false" 或v.setClickable(false) 和v.setFocusable(false) 声明您的TextView 不可点击/不可聚焦。现在应该将点击事件分派给TextView 的父级。
注意:
为了实现这一点,您必须将点击添加到其直接parent。或设置
android:clickable="false" 和 android:focusable="false" 到其直接父级将侦听器传递给进一步的父级。
【讨论】:
TextView 上使用 TextView#setOnClickListener(),即使它被声明为 android:clickable="false",即使 ClickListener 是设置为null (setOnclickListener(null))
android:inputType 属性,即使使用 clickable: false & focusable: false; 它也会默默地消耗点击事件。在我的情况下,它被设置为一种风格,我花了 30 分钟来找出原因。
我认为您需要使用其中一种方法才能在事件被发送到适当的组件之前拦截它:
Activity.dispatchTouchEvent(MotionEvent) - 这允许您的 Activity 在将所有触摸事件分派到窗口之前拦截它们。
ViewGroup.onInterceptTouchEvent(MotionEvent) - 这允许 ViewGroup 在事件被分派到子视图时观察它们。
ViewParent.requestDisallowInterceptTouchEvent(boolean) - 在父视图上调用它以指示它不应使用 onInterceptTouchEvent(MotionEvent) 拦截触摸事件。
更多信息here。
希望对您有所帮助。
【讨论】:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
有时只有这有帮助:
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 创建点击问题,请从您的 xml 文件中删除 android:inputType=""。
【讨论】:
android:inputType="none"
android:inputType="textCapWords"
这个答案类似于Alexander Ukhov's answer,除了它使用触摸事件而不是点击事件。这些事件允许父级显示正确的按下状态(例如,涟漪效应)。这个答案也在 Kotlin 而不是 Java 中。
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}
【讨论】:
如果您想同时查看OnTouch 和OnClick 的父子视图,请使用以下技巧:
用户 ScrollView 作为父视图并在其中将您的子视图放置在相对/线性布局中。
使父 ScrollView android:fillViewport="true" 不滚动视图。
然后将OnTouch 侦听器设置为父视图,将OnClick 侦听器设置为子视图。
并享受这两个监听器回调。
【讨论】: