Retrieve SupportMapFragment on Android Fragment

Retrieve SupportMapFragment on Android Fragment

Today, I implement a sample to show Google Maps on Android Fragment. I have an activity (MainActivity), two fragments contained in MainActivity is InfoFragment and MapFragment. In MapFragment, I attach a MapFragment in layout file.

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

Setup map implemented in MapFragment.java

/** * Created by haint on 7/13/2015. */
public class MapFragment extends Fragment {
 private GoogleMap mMap;
 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  return inflater.inflate(R.layout.fragment_map, container, false);
 }
 @Override public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);
  setUpMapIfNeeded();
 }
 @Override public void onResume() {
  super.onResume();
  setUpMapIfNeeded();
 }
 private void setUpMapIfNeeded() {
  // Do a null check to confirm that we have not already instantiated the map.
  if (mMap == null) {
   // Try to obtain the map from the SupportMapFragment.
   mMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
   // Check if we were successful in obtaining the map.
   if (mMap != null) {
    setUpMap();
   }
  }
 }

 /** * This is where we can add markers or lines, add listeners or move the camera. In this case, we * just add a marker near Africa. * <p/> * This should only be called once and when we are sure that {@link #mMap} is not null. */
 private void setUpMap() {
  mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
 }
}

I encountered an error when show Mapfragment with logged:

07-14 10:44:17.303 22695-22695/net.awpspace.demogooglemaps
E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: net.awpspace.demogooglemaps, PID: 22695 java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' on a null object reference

I searched reason of the error and had a solution for this:

The layout containing the map fragment is the layout for MapFragment. In that case, the SupportMapFragment is a child fragment of MapFragment. When I attempt to retrieve it, I’m using the Activity’s FragmentManager then encounter error. Solution for this:

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

INSTEAD BY:

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

Now it should work normally.