如何传递视图';s在Android上向其父级单击事件?

如何传递视图';s在Android上向其父级单击事件?,android,events,onclick,textview,Android,Events,Onclick,Textview,我在布局中有一个文本视图,其背景是选择器。文本视图的文本设置为从HTML跨越。 然后我用LinkMovementMethod设置TextView 现在,当我点击TextView时,click事件不会发送到其父布局以触发选择器 如何解决这个问题?我认为您需要使用其中一种方法,以便能够在事件发送到相应组件之前拦截事件: 活动。dispatchTouchEvent(MotionEvent)-这允许您的活动在将所有触摸事件发送到窗口之前拦截它们 ViewGroup.onInterceptTouchEve

我在布局中有一个文本视图,其背景是选择器。文本视图的文本设置为从HTML跨越。 然后我用LinkMovementMethod设置TextView

现在,当我点击TextView时,click事件不会发送到其父布局以触发选择器


如何解决这个问题?

我认为您需要使用其中一种方法,以便能够在事件发送到相应组件之前拦截事件:

活动。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
监听器查看父视图和子视图,请使用以下技巧:

  • 用户滚动视图作为父视图,并将子视图放置在相对/线性布局中

  • 使父ScrollView
    android: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)
    }