Acho que você precisa usar um desses métodos para poder interceptar o evento antes que ele seja enviado aos componentes apropriados:
Activity.dispatchTouchEvent(MotionEvent)
- Isso permite que sua atividade intercepte todos os eventos de toque antes de serem despachados para a janela.
ViewGroup.onInterceptTouchEvent(MotionEvent)
- Isso permite que um ViewGroup observe os eventos à medida que são despachados para as Views filhas.
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- Chame isso em uma Visualização pai para indicar que ela não deve interceptar eventos de toque com onInterceptTouchEvent (MotionEvent).
Mais informações aqui .
Espero que ajude.
Luis Miguel Serrano
fonte
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
Declare que
TextView
não é clicável / focalizável usandoandroid:clickable="false"
eandroid:focusable="false"
ouv.setClickable(false)
ev.setFocusable(false)
. Os eventos de clique devem ser despachados para oTextView
pai de agora.Nota:
Para conseguir isso , você deve adicionar clique ao seu direto
parent
. ou setandroid:clickable="false"
eandroid:focusable="false"
para seu pai direto para passar o ouvinte para outro pai .fonte
TextView#setOnClickListener()
noTextView
, ele se tornará clicável, mesmo se declarado comoandroid:clickable="false"
, e mesmo se oClickListener
estiver definido comonull
(setOnclickListener(null)
)android:inputType
atributo, ele consumirá silenciosamente os eventos de clique, mesmo com clickable: false & focusable: false; no meu caso, foi definido em um estilo e me custou 30 minutos para descobrir a causa.Às vezes, apenas isso ajuda:
Outra variante, nem sempre funciona:
fonte
CardView
como visão infantil, uma vez queCardView
parece ignorarclickable="false"
efocusable="false"
. No entanto, usarsetOnTouchListener
e chamaronTouchEvent
o pai permite que ele exiba feedback de toque (por exemplo, efeito cascata).Colocar
na criança, as visualizações obtêm seu estado drawable (focalizado, pressionado etc.) de seu pai direto, e não de si mesmas. você pode definir onclick para o pai e chamar o filho clicado
fonte
Se houver
TextView
problemas com o clique de criação, removaandroid:inputType=""
-o do arquivo xml.fonte
android:inputType="none"
Essa resposta é semelhante à resposta de Alexander Ukhov , exceto que usa eventos de toque em vez de eventos de clique. Esses eventos permitem que o pai exiba os estados pressionados apropriados (por exemplo, efeito cascata). Essa resposta também está em Kotlin em vez de Java.
fonte
Se você quer tanto
OnTouch
eOnClick
ouvinte para pais e filhos vista tanto, utilize o abaixo truque:O usuário ScrollView como uma visão pai e dentro dela colocou a visão filho dentro de Relative / LinearLayout.
Faça o Parent ScrollView
android:fillViewport="true"
para que a visualização não seja rolada.Em seguida, defina
OnTouch
listener como pai eOnClick
listener como visualizações Filha. E aproveite os dois retornos de chamada do ouvinte.fonte