0

I have a MapFragment in my XML:

    <fragment
    android:id="@+id/mapFrag"
    android:name="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/map_topbar"
    class="com.google.android.gms.maps.MapFragment" />

In my MapViewFragment I have a

     GoogleMap gmap;

in onCreate I do the following:

FragmentManager myFragmentManager = getFragmentManager();
SupportMapFragment mf =(SupportMapFragment)myFragmentManager.findFragmentById(R.id.mapFrag);
gmap = mf.getMap();

But I get a NullPointerException.

I've search and tried a lot of SO solutions but so far none have helped.

I've followed different tutorial:

http://android-er.blogspot.dk/2013/01/create-mapfragment-and-googlemap-using.html http://www.vogella.com/tutorials/AndroidGoogleMaps/article.html#maps_fragment

Where they use the same technique.

The log:

03-04 13:40:49.468: E/AndroidRuntime(32388): FATAL EXCEPTION: main
03-04 13:40:49.468: E/AndroidRuntime(32388): java.lang.NullPointerException
03-04 13:40:49.468: E/AndroidRuntime(32388):    at dk.adaptmobile.koegeapp.MapViewFragment.onCreate(MapViewFragment.java:56)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.support.v4.app.Fragment.performCreate(Fragment.java:1477)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.os.Handler.handleCallback(Handler.java:615)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.os.Looper.loop(Looper.java:137)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at android.app.ActivityThread.main(ActivityThread.java:4921)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at java.lang.reflect.Method.invokeNative(Native Method)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at java.lang.reflect.Method.invoke(Method.java:511)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
03-04 13:40:49.468: E/AndroidRuntime(32388):    at dalvik.system.NativeStart.main(Native Method)

Where line 56 is gmap = mf.getMap();

GrIsHu
  • 29,068
  • 10
  • 64
  • 102
Anton Gregersen
  • 385
  • 2
  • 7

3 Answers3

2

Your XML does not match your Fragment code, you are creating a SupportMapFragment object when in your XML you have MapFragment:

Replace this:

<fragment
android:id="@+id/mapFrag"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/map_topbar"
class="com.google.android.gms.maps.MapFragment" />

with:

<fragment
android:id="@+id/mapFrag"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/map_topbar"
class="com.google.android.gms.maps.SupportMapFragment" />
Adrian Olar
  • 2,883
  • 4
  • 35
  • 63
1

If you want to place a map inside of a fragment then I suggest you to use the MapView object in your layout instead of the MapFragment, here is a code that works for me:

The layout:

<?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" >

<com.google.android.gms.maps.MapView
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mapview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

And the fragment itself:

public class MapFragment extends Fragment  {

private static final String TAG = MapFragment.class.getSimpleName();
private MapView mapView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.new_mapview, container, false);

    // Gets the MapView from the XML layout and creates it
    mapView = (MapView) view.findViewById(R.id.mapview);
    mapView.onCreate(savedInstanceState);

    return view;
}


@Override
public void onPause() {
    mapView.onPause();
    super.onPause();
}


@Override
public void onResume() {
    mapView.onResume();
    super.onResume();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}
}
Emil Adz
  • 40,709
  • 36
  • 140
  • 187
  • It works, I can successfully getMap now. Only weird thing is that the map is empty, it is just white(no tiles or grid) which leads me to think it is not an API key problem. Any idea what might cause this? – Anton Gregersen Mar 05 '14 at 09:33
  • @AntonGregersen, and why exactly do you think it's not an api key problem? – Emil Adz Mar 05 '14 at 09:49
  • @EmilAdz because when I had the map in a fragment it worked fine and when I google the problem it seems like when people have an api key problem they have a grid, not a blank map as I do. – Anton Gregersen Mar 05 '14 at 09:54
  • According to [this](http://stackoverflow.com/questions/9959072/mapview-in-fragment-android-4-0-or-higher) it has to be in a MapActivity. – Anton Gregersen Mar 05 '14 at 12:45
0

XML

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

JAVA File

googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

This works for me if your class extends Activity

Mitesh Shah
  • 1,729
  • 2
  • 19
  • 37