App/Kotlin

[Android_API] 네이버 지도 안드로이드에서 사용하기 (액티비티, 프래그먼트)

Cune 2022. 3. 24. 14:47

 

 

네이버 지도 api를 사용하기 위한 기본 셋팅은 아래 링크로 가서 준비했다고 생각하고 시작합니다.

 

시작하기 · 네이버 지도 안드로이드 SDK

No results matching ""

navermaps.github.io

 

네이버 공식문서 [개발가이드]-[지도와 좌표]-[지도 객체] 에서는 MapFragment와 MapView 두가지 방법이 나와있습니다.

MapFragment의 경우는 액티비티에 지도만 띄워주고 MapView는 액티비티 지정영역에 지도를 띄울 수 있습니다.

 

왼쪽 <MapFragment> / 오른쪽 <MapView> 

설명코드대로 실행시켰을때 다음과 같이 나옵니다. (저는 지도보기버튼  클릭시 나타나도록 설정했습니다)

 

1. GlobalApplication ( sdk초기화 설정)

import android.app.Application
import com.naver.maps.map.NaverMapSdk

class GlobalApplication:Application() {
    override fun onCreate() {
        super.onCreate()

        // NaverMap SDK
        NaverMapSdk.getInstance(this).client =
            NaverMapSdk.NaverCloudPlatformClient("클라이언트 아이디")
    }

}

 

2. MainActivity (메인 액티비티)

사용하는 방식에 따라서 2-1 / 2-2를 사용하면 됩니다

지도보기 버튼('seeMapBtn'), 2-2 지도 영역 프레임 레이아웃('mapContent')

class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.seeMapBtn.setOnClickListener {	//seeMapBtn 클릭 시

		//2-1. MapActivity로 연결해서 화면이동
            /*val i = Intent(this, MapActivity::class.java)
            startActivity(i)*/

		//2-2. Fragment로 연결해서 현재 액티비티에 띄우기
          /*val naverMapFragment = NaverMapFragment()
            supportFragmentManager.beginTransaction()
                .add(R.id.mapContent, naverMapFragment).commit()*/
			//R.id.() 괄호에는 띄우고자 설정했던 영역의 아이디
        }
}

 

2-1. MapActivity -> 'MapFragment'방식

import android.os.Bundle
import androidx.annotation.UiThread
import androidx.fragment.app.FragmentActivity
import com.naver.maps.geometry.LatLng
import com.naver.maps.map.*
import com.naver.maps.map.overlay.Marker

class MapActivity : FragmentActivity(), OnMapReadyCallback {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_map)

        val fm = supportFragmentManager
        val mapFragment = fm.findFragmentById(R.id.map) as MapFragment?
            ?: MapFragment.newInstance().also {
                fm.beginTransaction().add(R.id.map, it).commit()
            }

        mapFragment.getMapAsync(this)
    }

    @UiThread
    override fun onMapReady(naverMap: NaverMap) {
        val options = NaverMapOptions()
            .camera(CameraPosition(LatLng(37.566, 126.978),  10.0))  // 카메라 위치 (위도,경도,줌)
            .mapType(NaverMap.MapType.Basic)    //지도 유형
            .enabledLayerGroups(NaverMap.LAYER_GROUP_BUILDING)  //빌딩 표시

        MapFragment.newInstance(options)

        val marker = Marker()
        marker.position = LatLng(37.566, 126.978)
        marker.map = naverMap
    }
}

activity_map.xml

<?xml version="1.0" encoding="utf-8"?>
    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.naver.maps.map.MapFragment" />

 

 

2-2. NaverMapFragment  -> 'MapView'방식

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.naver.maps.geometry.LatLng
import com.naver.maps.map.*
import com.naver.maps.map.overlay.Marker


class NaverMapFragment : Fragment(), OnMapReadyCallback {

    //지도 객체 변수
    private lateinit var mapView: MapView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val rootView = inflater.inflate(
            R.layout.fragment_naver_map,
            container, false
        ) as ViewGroup
        mapView = rootView.findViewById<View>(R.id.navermap) as MapView
        mapView.onCreate(savedInstanceState)
        mapView.getMapAsync(this)
        return rootView
    }

    override fun onMapReady(naverMap: NaverMap) {
        val options = NaverMapOptions()
            .camera(CameraPosition(LatLng(37.566, 126.978),  10.0))  // 카메라 위치 (위도,경도,줌)
            .mapType(NaverMap.MapType.Basic)    //지도 유형
            .enabledLayerGroups(NaverMap.LAYER_GROUP_BUILDING)  //빌딩 표시

        MapFragment.newInstance(options)

        val marker = Marker()
        marker.position = LatLng(37.566, 126.978)
        marker.map = naverMap
    }

    override fun onStart() {
        super.onStart()
        mapView.onStart()
    }

    override fun onResume() {
        super.onResume()
        mapView.onResume()
    }

    override fun onPause() {
        super.onPause()
        mapView.onPause()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mapView.onSaveInstanceState(outState)
    }

    override fun onStop() {
        super.onStop()
        mapView.onStop()
    }

    override fun onDestroyView() {
        super.onDestroyView()
        mapView.onDestroy()
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mapView.onLowMemory()
    }
}

fragment_naver_map.xml

<?xml version="1.0" encoding="utf-8"?>
    <com.naver.maps.map.MapView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/navermap"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

 

 

아래 블로그 글을 참조해서 작성했습니다 감사합니다.

https://andro-jinu.tistory.com/entry/studio3

 

[안드로이드 스튜디오] 네이버지도 #3 - 플래그먼트에서 표출하기

이번 포스팅에서는 네이버 클라우드 플랫폼에서 제공하는 네이버지도를 Activity가 아닌 플래그먼트에서 표출하는 방법을 살펴보도록 하겠습니다. 이전 포스트에서 MapView를 사용하여 네이버 지

andro-jinu.tistory.com