안드로이드 개발 중, 저를 포함하여 카카오맵 API를 사용해보신 분들이라면 충분히 겪으셨을만한 오류입니다.
카카오측에서 카카오맵은 MapView 내부 구현 구조 및 OS 제약으로 인해,
'한 화면에 동시에 2개 이상을 띄우는 것이 불가능' 하다고 합니다!
만일 2개 이상의 맵뷰를 생성한다면 아래와 같은 예외가 발생할 것입니다.
DaumMap does not support that two or more net.daum.mf.map.api.MapView objects exists at the same time
말 그대로 'MapView는 동시에 2개 이상 존재할 수 없다'는 의미로 해석됩니다.
그럼 어떻게 위와같은 오류를 해결할 수 있을지 알아보겠습니다.
기본적인 개념은 이렇습니다.
A 액티비티에서 B 액티비티를 실행해야 하는 상황이라면,
1. B 액티비티를 실행하는 시점에 A 액티비티의 MapView를 제거해주면 됩니다.
반대로 다시 B 액티비티에서 A 액티비티로 돌아와야 하는 상황이라면,
1. B 액티비티에서는 onFinish() 콜백 메서드를 Override하여 액티비티 종료 전에 MapView를 제거합니다.
2. A 액티비티에서는 안드로이드 생명주기의 onRestart() 콜백 메서드 내에 MapView를 새롭게 추가시켜줍니다.
코드로 함께 살펴보시겠습니다!
// A Activity.class
private lateinit var mapView: MapView
var mapViewContainer: RelativeLayout? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 맵뷰 초기화 및 추가
initMapView()
}
override fun onRestart() {
super.onRestart()
// 액티비티 재시작 시 (B 액티비티가 종료되고 다시 시작될 때)
// MapView가 포함되어 있지 않다면 추가
if (mapViewContainer?.contains(mapView)!!) {
try{
// 다시 맵뷰 초기화 및 추가
initMapView()
}catch (re: RuntimeException){
Timber.e(re.toString())
}
private fun initMapView() {
// 맵뷰 초기화 및 컨테이너 레이아웃에 추가
mapView = MapView(this).also {
mapViewContainer = RelativeLayout(this)
mapViewContainer?.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
binding.mainContainer.root.addView(mapViewContainer)
mapViewContainer?.addView(it)
}
}
A 액티비티 코드의 일부입니다.
액티비티가 최초 실행되어 onCreate() 콜백이 호출될 때, MapView를 담을 컨테이너로 RelativeLayout를 생성하고,
해당 컨테이너 자식으로 MapView를 추가합니다
그리고 onRestart() 콜백을 살펴보면, 만일 액티비티가 재시작되는 시점에 MapView가 포함되어 있지 않다면,
onCreate()처럼 새롭게 MapView를 초기화하여 컨테이너에 추가해줍니다.
lateinit var mapView: MapView // 카카오 맵 뷰
override fun finish() {
// 종료할 때 맵뷰 제거 (맵뷰 2개 이상 동시에 불가)
binding.kakaoMapContainer.removeView(mapView)
super.finish()
}
이제 B 액티비티로 넘어왔습니다. MapView는 A 액티비티와 동일하게 본인의 로직에 맞게 생성해주면 됩니다.
다만, 액티비티를 종료할 때 호출할 finish() 메서드에서 맵뷰를 제거하는 로직을 재정의해줄 필요가 있습니다.
위 코드를 따라서 작성하면 기존에 발생하던 오류를 해결하실 수 있을겁니다.
만약 똑같이 따라했는데도 오류가 발생하신다면 도움을 드릴 수 있도록 댓글을 남겨주세요!
내용에 오류가 있거나, 질문이 있으신 분들은 댓글을 남겨주시면 감사하겠습니다! 😊