Я думаю, вам нужно использовать один из этих методов, чтобы иметь возможность перехватить событие, прежде чем оно будет отправлено в соответствующие компоненты:
Activity.dispatchTouchEvent(MotionEvent)
- Это позволяет вашей Activity перехватывать все события касания до того, как они будут отправлены в окно.
ViewGroup.onInterceptTouchEvent(MotionEvent)
- Это позволяет ViewGroup отслеживать события по мере их отправки дочерним представлениям.
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- Вызовите это для родительского View, чтобы указать, что он не должен перехватывать события касания с onInterceptTouchEvent (MotionEvent).
Больше информации здесь .
Надеюсь, это поможет.
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
Объявите, что вы
TextView
не кликабельны / фокусируемы, используяandroid:clickable="false"
иandroid:focusable="false"
илиv.setClickable(false)
иv.setFocusable(false)
. События щелчка должны быть отправлены наTextView
родительскому объекту.Примечание:
Для этого вам нужно добавить щелчок в его директ
parent
. или установитеandroid:clickable="false"
иandroid:focusable="false"
своему прямому родителю, чтобы передать слушателя следующему родителю .источник
TextView#setOnClickListener()
наTextView
, он становится интерактивным, даже если он объявлен какandroid:clickable="false"
, и даже если для параметраClickListener
установлено значениеnull
(setOnclickListener(null)
)android:inputType
атрибут, он будет молча потреблять события щелчка даже с clickable: false и focusable: false; в моем случае это было оформлено в стиле, и мне потребовалось 30 минут, чтобы выяснить причину.Иногда помогает только это:
Другой вариант, работает не всегда:
источник
CardView
как дочернее представление, поскольку,CardView
похоже, игнорируетclickable="false"
иfocusable="false"
. Однако использованиеsetOnTouchListener
и вызовonTouchEvent
родителя вместо этого позволяет ему отображать сенсорную обратную связь (например, эффект пульсации).Ставить
в дочернем элементе представления получают свое доступное для рисования состояние (сфокусировано, нажато и т. д.) от своего прямого родителя, а не от себя. вы можете установить onclick для родителя, и он вызовет нажатие дочернего элемента
источник
Если вы
TextView
создаете проблемы с щелчком, удалите ихandroid:inputType=""
из XML-файла.источник
android:inputType="none"
Этот ответ похож на ответ Александра Ухова , за исключением того, что он использует события касания, а не события щелчка. Эти события позволяют родителю отображать правильные состояния нажатия (например, эффект пульсации). Этот ответ также находится на Kotlin вместо Java.
источник
Если вы хотите, чтобы оба
OnTouch
иOnClick
слушатель смотрели и на родителей, и на детей, используйте следующий трюк:Пользовательский ScrollView в качестве родительского представления и внутри него помещает дочернее представление в Relative / LinearLayout.
Сделайте родительский ScrollView
android:fillViewport="true"
так, чтобы просмотр не прокручивался.Затем установите
OnTouch
слушателя на родительский иOnClick
слушатель на дочерние представления. И наслаждайтесь обратными вызовами обоих слушателей.источник