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

时间:2010-12-11 06:29:40

标签: android events onclick textview

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

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

如何解决这个问题?

7 个答案:

答案 0 :(得分:193)

使用TextViewandroid:clickable="false"android:focusable="false"v.setClickable(false)声明您的v.setFocusable(false)无法点击/关注。点击事件现在应该发送给TextView的父母。

注意:

要实现此,您必须将点击添加到其直接parent。或设定 android:clickable="false"android:focusable="false"与其直接父将侦听器传递给其他父

答案 1 :(得分:43)

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

Activity.dispatchTouchEvent(MotionEvent) - 这允许您的Activity在调度到窗口之前拦截所有触摸事件。

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

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

更多信息here

希望有所帮助。

答案 2 :(得分:14)

有时候这只会有所帮助:

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

答案 3 :(得分:8)

Put

android:duplicateParentState="true"

in child then the views get its drawable state (focused, pressed, etc.) from its direct parent rather than from itself. you can set onclick for parent and it call on child clicked

答案 4 :(得分:3)

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

答案 5 :(得分:1)

此答案与Alexander Ukhov's answer相似,不同的是它使用触摸事件而不是单击事件。这些事件使父母能够显示适当的按下状态(例如,波纹效果)。这个答案也用Kotlin代替了Java。

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

答案 6 :(得分:0)

如果您想同时OnTouchOnClick的监听者同时查看父级和子级,请使用以下技巧:

  1. 用户ScrollView作为父视图,并在其中将子视图放置在Relative / LinearLayout中。

  2. 将父级ScrollView设为android:fillViewport="true",以使View不会滚动。

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