Search code examples
androidandroid-studiogoogle-maps-api-2

SupportMapFragment return null on Android studio


I move my application eclipse to android studio. My code works perfect on Eclipse but on Android studio

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

return null my xml is here

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    >
   <com.google.android.gms.ads.AdView
        android:id="@+id/adMob"
        android:layout_width="fill_parent"
        android:layout_height="70dp"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/admob_unit_id" />
   <fragment
  android:id="@+id/map"        
  android:layout_width="fill_parent"        
  android:layout_height="fill_parent"        
  class="com.google.android.gms.maps.SupportMapFragment"/>


</LinearLayout>

why it return null?

I searched and compileSdkVersion 21 cause it. But if I change it 19 still return null


Solution

  • getMap() is not guaranteed to return a map instance. Use getMapAsync(OnMapReadyCallback) where the callback will be invoked once the map is ready and you're guaranteed it won't be null. This is available since Google Play Services library v6.5.

    When using this approach get rid of your mapView variable, the callback will receive a map reference anyway. Also note that SupportMapFragment is not MapView is not GoogleMap (I'm referring to the misnamed variable here, be careful.).

    EDIT: Suggested solution:

    public class MainActivity extends ActionBarActivity {
    
      SupportMapFragment mMapFragment;
    
      @Override
      public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.activity_main);
        mMapFragment = getSupportFragmentManager().findFragmentById(R.id.map);
    
        // etc.
      }
    
      public void doSomethingWithMap() {
        mMapFragment.getMapAsync(new OnMapReadyCallback() {
          @Override
          public void onMapReady(GoogleMap googleMap) {
            // do whatever you need with the map
          }
        });
      }
    }
    

    The point is when you need to access the map, you ask the fragment for it, and it will be delivered to you via a callback.