일일 회고
힘들다 ㅎㅎ..
오늘의 키워드
- 트러블 슈팅
트러블 슈팅
원인
스크롤 뷰에 kakaoMap을 두기 위해 FrameLayout를 두었는데 스크롤 뷰에 의해 kakao 의 포커스가 가지않아 맵 스크롤을 통해 맵을 제어 할 수 없는 현상을 발견함
→ 스크롤 뷰 하위에 스크롤 가능한 객체가 또 있어 상위 스크롤 뷰에만 포커스가 가있어서 그랬다고 생각
해결 과정
티맵 뷰 위에서 스크롤 뷰 터치 시 스크롤을 막기 위해 FrameLayout을 커스텀하여 구현해서 FrameLayout에 TouchEvent시 FrameLayout위에서 터치 시에는 touchListener를 달아서 상위 스크롤 뷰의 스크롤을 반응을 막아서 해결함
package com.nbcamp.tripgo.util
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.FrameLayout
class KaKaoFrameLayout(
context: Context,
attrs: AttributeSet
) : FrameLayout(context, attrs) {
private var listener: OnTouchListener? = null
// 터치 시 반응 할 리스너 선언
interface OnTouchListener {
fun onTouch()
}
// 리스너 초기화
fun setTouchListener(listener: OnTouchListener) {
this.listener = listener
}
// 터치 이벤트 발생 시 불리는 콜백
/**ACTION_DOWN : 손가락 또는 물체가 화면에 처음 접촉할 때 발생하는 이벤트,
* 이벤트에는 제스처의 초기 시작 위치가 포함
*/
/**
* ACTION_UP : 손가락 또는 물체가 화면에서 떼어질 때 발생하는 이벤트 제스처의 최종 놓은 위치가 포함
*/
override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
when (event?.action) {
// 터치 리스너를 실행
MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP -> listener?.onTouch()
}
return super.dispatchTouchEvent(event)
}
override fun performClick(): Boolean {
super.performClick()
return true
}
}
private fun doNotFrameScroll() = with(binding) {
// 맵 컨테이너를 터치할 때마다 리스너가 실행
container.setTouchListener(object : TMapFrameLayout.OnTouchListener {
override fun onTouch() {
// 스크롤 뷰의 터치 이벤트를 막음
nestedScrollView.requestDisallowInterceptTouchEvent(true)
}
})
}
참고자료
'내일배움캠프 7기 > TIL' 카테고리의 다른 글
내일배움캠프 7기 Android TIL 70일차 (2023.11.03) (1) | 2023.11.03 |
---|---|
내일배움캠프 7기 Android TIL 69일차 (2023.11.01) (0) | 2023.11.01 |
내일배움캠프 7기 Android TIL 67일차 (2023.10.30) (0) | 2023.10.31 |
내일배움캠프 7기 Android TIL 66일차 (2023.10.27) (0) | 2023.10.27 |
내일배움캠프 7기 Android TIL 65일차 (2023.10.26) (1) | 2023.10.27 |