Apple is Apple

일일 회고

 

힘들다 ㅎㅎ..


오늘의 키워드

  • 트러블 슈팅

트러블 슈팅

원인

스크롤 뷰에 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)
            }
        })
    }

참고자료

 

[안드로이드] 스크롤뷰 안에 맵 (googleMap in ScrollView) 예제, Custom FrameLayout

스크롤뷰 안에 맵 (googleMap in ScrollView) 예제, Custom FrameLayout

bictoselfdev.blogspot.com

 

profile

Apple is Apple

@mjjjjjj