Как передать событие onClick представления его родителю на Android? - PullRequest
88 голосов
/ 11 декабря 2010

У меня есть TextView в макете, чей фон является селектором. И текст TextView установлен на Spanned from HTML. Затем я устанавливаю TextView с помощью LinkMovementMethod.

Теперь, когда я нажимаю на TextView, событие нажатия не отправляется в его родительский макет, чтобы активировать селектор.

Как это решить?

Ответы [ 7 ]

193 голосов
/ 23 сентября 2013

Объявите ваш TextView недоступным для кликабельности / фокусировки, используя android:clickable="false" и android:focusable="false" или v.setClickable(false) и v.setFocusable(false) События нажатия должны быть отправлены родительскому элементу TextView.

Примечание:

Чтобы достичь этого , вы должны добавить клик к его прямому parent. или установить android:clickable="false" и android:focusable="false" своему непосредственному родителю , чтобы передать слушателя другому родителю .

43 голосов
/ 12 декабря 2010

Я думаю, вам нужно использовать один из этих методов, чтобы иметь возможность перехватить событие, прежде чем оно будет отправлено соответствующим компонентам:

Activity.dispatchTouchEvent(MotionEvent) - это позволяет вашей деятельности перехватывать все сенсорные события, прежде чем они будут отправлены в окно.

ViewGroup.onInterceptTouchEvent(MotionEvent) - Это позволяет ViewGroup наблюдать за событиями, когда они отправляются дочерним представлениям.

ViewParent.requestDisallowInterceptTouchEvent(boolean) - вызовите это для родительского просмотра, чтобы указать, что он не должен перехватывать события касания с помощью onInterceptTouchEvent (MotionEvent).

Подробнее здесь .

Надеюсь, это поможет.

15 голосов
/ 21 мая 2015

Иногда только это помогает:

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);
9 голосов
/ 25 апреля 2016

Поместите

android:duplicateParentState="true"

в дочерний элемент, тогда представления получают его нарисованное состояние (сфокусировано, нажато и т. Д.) От своего прямого родителя, а не от самого себя.Вы можете установить OnClick для родителя, и он вызывает на ребенка нажал

3 голосов
/ 29 июля 2017

Если ваш TextView создает проблемы с кликами, тогда удалите android:inputType="" из вашего xml-файла.

1 голос
/ 22 октября 2018

Этот ответ похож на ответ Александра Ухова , за исключением того, что он использует события касания, а не события щелчка.Эти события позволяют родителю отображать правильные нажатые состояния (например, эффект ряби).Этот ответ также на Kotlin вместо Java.

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}
0 голосов
/ 24 июля 2018

Если вы хотите, чтобы оба слушателя OnTouch и OnClick слушали родительский и дочерний представления, используйте следующий трюк:

  1. Пользователь ScrollView в качестве родительского представления, внутри которого помещено дочернее представление в Relative / LinearLayout.

  2. Сделать родительский ScrollView android:fillViewport="true", чтобы просмотр не был прокручен.

  3. Затем установите OnTouch слушатель родительского и OnClick слушатель дочерних представлений. И наслаждайтесь обоими обратными вызовами слушателя.

...