如何传递视图';s在Android上向其父级单击事件?
我在布局中有一个文本视图,其背景是选择器。文本视图的文本设置为从HTML跨越。 然后我用LinkMovementMethod设置TextView 现在,当我点击TextView时,click事件不会发送到其父布局以触发选择器如何传递视图';s在Android上向其父级单击事件?,android,events,onclick,textview,Android,Events,Onclick,Textview,我在布局中有一个文本视图,其背景是选择器。文本视图的文本设置为从HTML跨越。 然后我用LinkMovementMethod设置TextView 现在,当我点击TextView时,click事件不会发送到其父布局以触发选择器 如何解决这个问题?我认为您需要使用其中一种方法,以便能够在事件发送到相应组件之前拦截事件: 活动。dispatchTouchEvent(MotionEvent)-这允许您的活动在将所有触摸事件发送到窗口之前拦截它们 ViewGroup.onInterceptTouchEve
如何解决这个问题?我认为您需要使用其中一种方法,以便能够在事件发送到相应组件之前拦截事件:
活动。dispatchTouchEvent(MotionEvent)
-这允许您的活动在将所有触摸事件发送到窗口之前拦截它们
ViewGroup.onInterceptTouchEvent(MotionEvent)
-这允许视图组在将事件分派到子视图时查看事件
ViewParent.RequestDisallowWinterCeptTouchEvent(布尔值)
-在父视图上调用此函数,以指示它不应使用onInterceptTouchEvent(MotionEvent)截获触摸事件
更多信息
希望能有所帮助。使用
android:clickable=“false”
和android:focusable=“false”
或v.setClickable(false)
和v.setFocusable(false)
声明您的文本视图不可点击/聚焦。单击事件现在应发送到文本视图的父级
注意:
为了实现这一点,您必须将click添加到其直接的父项中。或设置
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);
放
在子视图中,视图从其直接父视图而不是从其自身获取其可绘制状态(聚焦、按下等)。
如果您的TextView
创建单击问题,则可以为父对象设置onclick,并在单击子对象时调用它,然后从xml文件中删除android:inputType=“”
如果您想同时使用OnTouch
和OnClick
监听器查看父视图和子视图,请使用以下技巧:
用户滚动视图作为父视图,并将子视图放置在相对/线性布局中
使父ScrollViewandroid:fillViewport=“true”
不滚动视图
然后将OnTouch
listener设置为父视图,并将OnClick
listener设置为子视图。
并享受两个侦听器回调
此答案与类似,只是它使用触摸事件而不是单击事件。这些事件允许父级显示正确的按下状态(例如,涟漪效应)。这个答案也是用Kotlin而不是Java实现的
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}
是否有一种更简单的方法来传递事件以触发父视图中的onClick和onLongClick,或者我必须自己实现它们?请检查:您可能希望尝试按照建议将相同的click侦听器传递给其他实例,尽管我不知道它是否有效,但可能值得一试。下面的答案非常清楚。我应该实例化MotionEvent吗?请解释一下@LuisMiguelSerrano@olegario,通常使用@Override重新定义dispatchTouchEvent等方法,以定义其新行为,因此您只需接收系统提供给您的活动(或应用程序的另一个组件)的运动事件,您可以根据自己的规则处理和/或转发给任意数量的子组件。类似于:@Override public boolean dispatchTouchEvent(MotionEvent ev){…}
噢,如果我能给这个+100,我会的。我一直在试图弄清楚如何使单击仅在ViewPager中工作,而不在TouchImageView实现onTouch的适配器布局中工作!这个解决方案非常有效。但是如果我想处理EditText的焦点更改事件呢?场景是:我有一个包含EditText、相对布局、微调器和列表视图的布局。我想在触摸屏幕上除edittext和Spinner之外的任何位置时触发父布局的触摸事件。需要记住的一点是,如果在TextView
上使用TextView\setOnClickListener()
,即使声明为android:clickable=“false”
,它也会变得可点击,即使ClickListener
设置为null
(setOnclickListener(null)
)有趣的事实:如果在TextView中有一个android:inputType
属性,它将默默地使用click事件,即使使用clickable:false和focusable:false;在我的例子中,它是以一种风格设置的,我花了30分钟来找出原因。如果你不知道为什么,我建议你不要这样做。只是说…每个人都有自己的问题。你应该把它设置为android:inputType=“none”
我也有同样的问题。在文本视图中,我将android:inputType=“textCapWords”
设置为cardwiew
的子视图,因为cardwiew
似乎忽略了clickable=“false”
和focusable=“false”
。但是,在父对象上使用setOnTouchListener
并调用onTouchEvent
,可以让父对象显示触摸反馈(例如涟漪效应)。我在下面发布了相关代码:。OP希望在单击子对象时调用父对象的单击侦听器,反之亦然。回答非常有用,谢谢!但我建议进行以下澄清:1)使用触摸视图的其他名称-“触摸视图”,例如;2) 调用performClick()而不是onTouchEvent()
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}