답변:
적절한 구성 요소로 전송되기 전에 이벤트를 가로 챌 수 있도록 이러한 방법 중 하나를 사용해야한다고 생각합니다.
Activity.dispatchTouchEvent(MotionEvent)
-이렇게하면 활동이 모든 터치 이벤트가 창으로 전달되기 전에 가로 챌 수 있습니다.
ViewGroup.onInterceptTouchEvent(MotionEvent)
-이것은 ViewGroup이 자식 뷰에 전달되는 이벤트를 볼 수 있도록합니다.
ViewParent.requestDisallowInterceptTouchEvent(boolean)
-onInterceptTouchEvent (MotionEvent)로 터치 이벤트를 가로 채지 않아야 함을 나타 내기 위해 부모 View에서 이것을 호출합니다.
도움이 되었기를 바랍니다.
@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 분이 소요되었습니다.
때때로 이것은 도움이됩니다 :
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);
CardView
때문에 자식보기로 작동했습니다 . 그러나 대신 부모를 사용 하고 호출 하면 부모가 터치 피드백 (예 : 물결 효과)을 표시 할 수 있습니다. CardView
clickable="false"
focusable="false"
setOnTouchListener
onTouchEvent
이 답변은 클릭 이벤트가 아닌 터치 이벤트를 사용한다는 점을 제외하면 Alexander Ukhov의 답변 과 유사 합니다. 이러한 이벤트를 통해 부모는 적절한 눌림 상태 (예 : 잔물결 효과)를 표시 할 수 있습니다. 이 답변은 Java 대신 Kotlin에도 있습니다.
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}