MapFragment returns null

mMapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentByTag(MAP_FRAGMENT_TAG); // We only create a fragment if it doesn't already exist. if (mMapFragment == null) { mMapFragment = SupportMapFragment.newInstance(); // Then we add it using a FragmentTransaction. FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG); fragmentTransaction.commit(); mMap=mMapFragment.getMap(); 

This code card is visible but cannot access the card.

MMAP = mMapFragment.getMap (); show zero error how to fix it

+6
source share
6 answers

Update 1: getMap() is deprecated

It is better to use the getMapAsync() method of MapFragment/SupportMapFragment . An example of using the method shown below (copied from the documentation ).

 import com.google.android.gms.maps.*; import com.google.android.gms.maps.model.*; import android.app.Activity; import android.os.Bundle; public class MapPane extends Activity implements OnMapReadyCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map_activity); MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap map) { LatLng sydney = new LatLng(-33.867, 151.206); map.setMyLocationEnabled(true); map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); map.addMarker(new MarkerOptions() .title("Sydney") .snippet("The most populous city in Australia.") .position(sydney)); } } 

Quoting Google MapFragment / SupportMapFragment

GoogleMap can only be acquired with getMap () when the base map system is loaded and the main view in the fragment exists. This class automatically initializes the map system and view; however, you cannot be sure when it will be ready, because it depends on the availability of the Google Play APK services. If GoogleMap is not available, getMap () returns null.

In your code, you will immediately get GoogleMap AFTER MapFragment . Wait until MapFragment is fully loaded into action, so you can get GoogleMap .

Perhaps you can deliver the GoogleMap from MapFragment to Activity using an interface, for example.

 public class MyMapFragment extends SupportMapFragment { private MapCallback callback; public void setMapCallback(MapCallback callback) { this.callback = callback; } public static interface MapCallback { public void onMapReady(GoogleMap map); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(callback != null) callback.onMapReady(getMap()); } } public class MyActivity extends Activity implements MyMapFragment.MapCallback { // ......... @Override public void onCreate(Bundle onsavedInstanceState) { mMapFragment = (MyMapFragment) getSupportFragmentManager() .findFragmentByTag(MAP_FRAGMENT_TAG); // We only create a fragment if it doesn't already exist. if (mMapFragment == null) { mMapFragment = MyMapFragment.newInstance(); mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded // Then we add it using a FragmentTransaction. FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG); fragmentTransaction.commit(); } else { mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded } @Override public void onMapReady(GoogleMap map) { // Do what you want to map } } 
+17
source

import part

 import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; 

inside oncreate

 SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); mMap = mapFragment.getMap(); 

And Xml Part

 <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> 

Make sure you put

 <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="api key"/> 

inside the <application></application> tags.

and grant this permission in the manifest file

 <permission android:name="packagename.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <uses-permission android:name="packagename.permission.MAPS_RECEIVE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> 
+2
source

Your xml must have SupportMapFragment

 <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> 
+1
source

I solved this problem when I put this code:

 @Override public void onPause() { Fragment fragment = (getFragmentManager().findFragmentById(R.id.map_tab)); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); super.onPause(); } 

or i put this code in onCreate

 if (mView != null) { ViewGroup parent = (ViewGroup) mView.getParent(); if (parent != null) { parent.removeView(mView); } } try { mView = inflater.inflate(R.layout.tab_map_layout, container, false); } catch (InflateException e) { } 
+1
source

Following @ Glenn-- from October 1 to October 13 at 6:05 to create this piece of source code.

My implementation replaces SupportMapFragment with MapFragment and supports Google Maps Version 2

I want to remember again:

GoogleMap can only be obtained using getMap () when the base map system is loaded and there is a basic view in the fragment. This class automatically initializes the map system and view; however, you cannot be sure when it will be ready, because it depends on the availability of the Google Play APK services. If GoogleMap is not available, getMap () will return null.

My implementation:

AndroidManifest.xml

 <!-- Permissions --> <!-- Used by the Google Maps API to download map tiles from Google Maps servers. --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <!-- Allows the Google Maps API to check the connection status in order to determine whether data can be downloaded. --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- Allows the Google Maps API to cache map tile data in the device external storage area. --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- Allows the Google Maps API to use WiFi or mobile cell data (or both) to determine the device location. --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- Allows the Google Maps API to use the Global Positioning System (GPS) to determine the device location to within a very small area. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Permissions --> <!-- Required OpenGL ES 2.0. for Maps V2 --> <!-- The Google Maps Android API uses OpenGL ES version 2 to render the map. If OpenGL ES version 2 is not installed, your map will not appear. sWe recommend that you add the following <uses-feature> element as a child of the <manifest> element in AndroidManifest.xml: --> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- Google Play Services --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <!-- Goolge Maps API Key --> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyATC4WBLLewjdwYDFVTnJH8hA18gG_GgvY" /> </application> 

activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="mapa.bg.MapaMainActivity" android:background="#ccc"> <!-- Google Map Container --> <RelativeLayout android:id="@+id/google_map_container" android:layout_width="match_parent" android:layout_height="match_parent"/> <!-- Google Map Container --> </RelativeLayout> 

ApplicationMapFragment.java

 public class ApplicationMapFragment extends MapFragment { private MapCallback callback; public void setMapCallback(MapCallback callback) { this.callback = callback; } public static interface MapCallback { public void onMapReady(GoogleMap map); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(callback != null) callback.onMapReady(getMap()); } /** * Initialize default Google Maps Options for our Application * @return GoogleMapOptions */ public GoogleMapOptions initializeGoogleMapsOptions() { GoogleMapOptions googleMapOptions = new GoogleMapOptions() .mapType(GoogleMap.MAP_TYPE_HYBRID); return googleMapOptions; } } 

MainActivity.java

 public class MainActivity extends Activity implements ApplicationMapFragment.MapCallback { // Get Class Name private static String TAG = MainActivity.class.getName(); // Create a new Map fragment private ApplicationMapFragment mapFragment; // Google Map Fragment Name private static String MAP_FRAGMENT_TAG = "google_maps_fragment"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { initilizeMapFragment(); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "Google Maps can't be loaded", e); } } /** * Initialize a new Map Fragment */ private void initilizeMapFragment() { // Try to get Map Fragment mapFragment = (ApplicationMapFragment) getFragmentManager() .findFragmentByTag(MAP_FRAGMENT_TAG); // We only create a fragment if it doesn't already exist. if (mapFragment == null) { mapFragment = new ApplicationMapFragment(); mapFragment.initializeGoogleMapsOptions(); // This activity will receive the Map object once the map fragment is fully loaded mapFragment.setMapCallback(this); // Then we add it using a FragmentTransaction. FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.google_map_container, mapFragment, MAP_FRAGMENT_TAG); fragmentTransaction.commit(); } else { // This activity will receive the Map object once the map fragment is fully loaded mapFragment.setMapCallback(this); } } @Override public void onMapReady(GoogleMap map) { Log.d(TAG, "Google Map is loaded"); MarkerOptions marker = new MarkerOptions() .position(new LatLng(10, 10)) .title("Hello World"); map.addMarker(marker); } } 
+1
source

Really hack the solution, but since the given API is a bad fragment ...

Note that I am doing this from a user view and accessing an Activity using (Activity) getContext ()

  addOnLayoutChangeListener(new OnLayoutChangeListener(){ @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { GoogleMap map = mapFragment.getMap(); if (map != null) { //Do stuff }else{ removeOnLayoutChangeListener(this); } } }); 
0
source

Source: https://habr.com/ru/post/954990/


All Articles