Map Object
A map consists of two elements: View and Interface. The View element displays a map on the screen, and MapFragment
and MapView
are in charge of this. The Interface element, associated with interfaces used in a map, is handled by the NaverMap
class, which provides most of the map features, including adding overlays and interacting with the map.
MapFragment
and MapView
can be directly created by developers, while NaverMap
can only be obtained by using a callback method.
Display maps
A map can be displayed with a fragment or a view. Add either a fragment or a view to the layout, and a map is displayed on the screen.
MapFragment
Using MapFragment
is recommended to display a map on your app screen. MapFragment
is a sub class of androidx.fragment.app.Fragment
, and like other fragments, it can be added by using the layout XML or FragmentTransaction
.
The following code example uses the layout XML to display a map.
<androidx.fragment.app.FragmentContainerView android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
android:name="com.naver.maps.map.MapFragment" />
The following code example uses FragmentTransaction
to display a map.
FragmentManager fm = getSupportFragmentManager();
MapFragment mapFragment = (MapFragment)fm.findFragmentById(R.id.map);
if (mapFragment == null) {
mapFragment = MapFragment.newInstance();
fm.beginTransaction().add(R.id.map, mapFragment).commit();
}
Java
FragmentManager fm = getSupportFragmentManager();
MapFragment mapFragment = (MapFragment)fm.findFragmentById(R.id.map);
if (mapFragment == null) {
mapFragment = MapFragment.newInstance();
fm.beginTransaction().add(R.id.map, mapFragment).commit();
}
Kotlin
val fm = supportFragmentManager
val mapFragment = fm.findFragmentById(R.id.map) as MapFragment?
?: MapFragment.newInstance().also {
fm.beginTransaction().add(R.id.map, it).commit()
}
MapView
Instead of using a fragment, you can directly use a view. Add MapView
to your layout, and a map is displayed just like using MapFragment
.
The following code example adds MapView
to the layout XML to display a map.
<com.naver.maps.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Note that you should call onCreate()
, onStart()
, onResume()
, onPause()
, onStop()
, onDestroy()
, onSaveInstanceState()
, and onLowMemory()
following the activity lifecycle as shown in the following example when using MapView
. Otherwise, your map does not work properly. We recommend you to use MapFragment
because it does not require you to handle such process.
The following code example shows how to call the lifecycle methods of MapView
in the fragment.
public class MapViewFragment extends Fragment {
private MapView mapView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// ...
}
@Override
public void onViewCreated(@NonNull View view,
@Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mapView = view.findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
mapView.onStart();
}
@Override
public void onResume() {
super.onResume();
mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
@Override
public void onStop() {
super.onStop();
mapView.onStop();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
}
Java
public class MapViewFragment extends Fragment {
private MapView mapView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// ...
}
@Override
public void onViewCreated(@NonNull View view,
@Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mapView = view.findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
mapView.onStart();
}
@Override
public void onResume() {
super.onResume();
mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
@Override
public void onStop() {
super.onStop();
mapView.onStop();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
}
Kotlin
class MapViewFragment : Fragment() {
private lateinit var mapView: MapView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup,
savedInstanceState: Bundle): View {
// ...
}
override fun onViewCreated(view: View, @Nullable savedInstanceState: Bundle) {
super.onViewCreated(view, savedInstanceState)
mapView = view.findViewById(R.id.map_view)
mapView.onCreate(savedInstanceState)
}
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()
}
}
The following code example shows how to call the lifecycle methods of MapView
in the activity.
public class MapViewActivity extends Activity {
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
mapView = findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
super.onStart();
mapView.onStart();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
@Override
protected void onStop() {
super.onStop();
mapView.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
}
Java
public class MapViewActivity extends Activity {
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
mapView = findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
super.onStart();
mapView.onStart();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
@Override
protected void onStop() {
super.onStop();
mapView.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
}
Kotlin
class MapViewActivity : Activity() {
private lateinit var mapView: MapView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
mapView = findViewById(R.id.map_view)
mapView.onCreate(savedInstanceState)
}
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 onDestroy() {
super.onDestroy()
mapView.onDestroy()
}
override fun onLowMemory() {
super.onLowMemory()
mapView.onLowMemory()
}
}
Obtain NaverMap object
As the MapFragment
and MapView
are only in charge of map views, you need the NaverMap
object, which is in charge of interfaces, to call an API. Add OnMapReadyCallback
by using the MapFragment
or MapView
’s getMapAsync()
method, and you can asynchronously obtain the NaverMap
object. When the NaverMap
object is ready, the onMapReady()
callback method is called.
The following code example shows how to obtain the NaverMap
object by adding the OnMapReadyCallback
.
public class MapFragmentActivity extends FragmentActivity
implements OnMapReadyCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_fragment_activity);
FragmentManager fm = getSupportFragmentManager();
MapFragment mapFragment = (MapFragment)fm.findFragmentById(R.id.map);
if (mapFragment == null) {
mapFragment = MapFragment.newInstance();
fm.beginTransaction().add(R.id.map, mapFragment).commit();
}
mapFragment.getMapAsync(this);
}
@UiThread
@Override
public void onMapReady(@NonNull NaverMap naverMap) {
// ...
}
}
Java
public class MapFragmentActivity extends FragmentActivity
implements OnMapReadyCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_fragment_activity);
FragmentManager fm = getSupportFragmentManager();
MapFragment mapFragment = (MapFragment)fm.findFragmentById(R.id.map);
if (mapFragment == null) {
mapFragment = MapFragment.newInstance();
fm.beginTransaction().add(R.id.map, mapFragment).commit();
}
mapFragment.getMapAsync(this);
}
@UiThread
@Override
public void onMapReady(@NonNull NaverMap naverMap) {
// ...
}
}
Kotlin
class MapFragmentActivity : FragmentActivity(), OnMapReadyCallback {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.map_fragment_activity)
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) {
// ...
}
}