如何将视图的onClick事件传递给Android上的父项?

shi*_*ami 94 events android onclick textview

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

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

该如何解决?

siy*_*iyb 204

TextView使用android:clickable="false"android:focusable="false"v.setClickable(false)和声明你的不可点击/可聚焦v.setFocusable(false).应立即将点击​​事件分派给TextView父母.

注意:

为了实现这一点,您必须直接添加点击parent.或者设置 android:clickable="false"android:focusable="false"其直接父传听众进一步父.

  • 要记住的重要一点是,如果在`TextView`上使用`TextView#setOnClickListener()`,它就会变得可点击,即使它被声明为`android:clickable ="false"`,即使是`ClickListener `设置为`null`(`setOnclickListener(null)`) (7认同)
  • 出于某种原因,这对我不起作用 (7认同)
  • 有趣的事实:如果在 TextView 中有一个 `android:inputType` 属性,即使使用 clickable: false & focusable: false,它也会默默地消耗点击事件;就我而言,它设置为一种样式,我花了 30 分钟才找出原因。 (3认同)
  • 场景是:我有一个包含edittext,相对布局,微调器和列表视图的布局.每当我触摸screenexcept edittext和spinner上的任何地方时,我想触发父布局的触摸事件 (2认同)

Lui*_*ano 44

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

Activity.dispatchTouchEvent(MotionEvent) - 这允许您的Activity在将所有触摸事件分派到窗口之前拦截它们.

ViewGroup.onInterceptTouchEvent(MotionEvent) - 这允许ViewGroup在将事件分派给子视图时观察事件.

ViewParent.requestDisallowInterceptTouchEvent(boolean) - 在父视图上调用此方法以指示它不应使用onInterceptTouchEvent(MotionEvent)拦截触摸事件.

更多信息在这里.

希望有所帮助.


小智 15

有时这只会有所帮助:

View child = parent.findViewById(R.id.btnMoreText);
    child.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            View parent = (View) v.getParent();
            parent.performClick();
        }
    });
Run Code Online (Sandbox Code Playgroud)

另一种变体,并非总是如此:

child.setOnClickListener(null);
Run Code Online (Sandbox Code Playgroud)


Ahm*_*agh 10

android:duplicateParentState="true"
Run Code Online (Sandbox Code Playgroud)

在孩子中,视图从其直接父母而不是从其自身获得其可绘制状态(聚焦,按压等).您可以为父级设置onclick,并在单击子项时调用它

  • OP 希望在单击子级时调用父级的单击侦听器,反之亦然。 (3认同)

小智 5

如果您TextView创建点击问题,请android:inputType=""从您的 xml 文件中删除。


met*_*ure 5

这个答案与Alexander Ukhov 的答案类似,只是它使用触摸事件而不是点击事件。这些事件允许父级显示正确的按下状态(例如,连锁反应)。这个答案也是用 Kotlin 而不是 Java 给出的。

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}
Run Code Online (Sandbox Code Playgroud)