2015-01-14 63 views
5

Hee Guys,SupportMapFragment and onMapReady

我一直在尋找幾個小時,嘗試了不同的東西,其中大部分我已經包括在內。我希望你們能夠幫助我明顯看不到的東西。

我在Maps的片段中有一個SupportMapFragment。我曾經有這個工作,但由於某種原因,它現在只是用一個空指針崩潰。在搜索了幾個小時並閱讀了一些文檔後,我發現我使用了不推薦的方式,所以我嘗試使用建議的一個:onMapReady。然而,它沒有當我使用

com.google.android.gms.maps.SupportMapFragment 

即使識別功能,下面是我的XML與片段:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/frameLayoutMainAct" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

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

    <View 
     android:id="@+id/map_overlay" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</FrameLayout> 

這裏是在OnViewCreated啓動代碼:

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    if(GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.getContext()) == ConnectionResult.SUCCESS) { 
     initMap(); 
     if (locations != null) { 
      addMarkers(); 
     } 
     moveMapToCuracao(); 
    } 
} 

public void initMap() { 
    final SupportMapFragment myMAPF = (SupportMapFragment) getFragmentManager() 
      .findFragmentById(mapView); 
    myMAPF.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(GoogleMap googleMap) { 
      mGoogleMap = googleMap; 

      mGoogleMap.setPadding(50, 0, 0, 0); 
      mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false); 
      mGoogleMap.setMyLocationEnabled(true); 
      mGoogleMap 
        .setOnMyLocationChangeListener(new OnMyLocationChangeListener() { 

         @Override 
         public void onMyLocationChange(Location location) { 
          // TODO Auto-generated method stub 
          GeomagneticField field = new GeomagneticField(
            (float) location.getLatitude(), 
            (float) location.getLongitude(), 
            (float) location.getAltitude(), System 
            .currentTimeMillis()); 

          // getDeclination returns degrees 
          mDeclination = field.getDeclination(); 
         } 

        }); 

      if (locations != null) { 
       addMarkers(); 
      } 
      moveMapToCuracao(); 
     } 
    }); 
} 

更新:感謝歐根的更新代碼

但stil在帶有NullPointerException的getMapAsync()上崩潰。

+1

1.你確定你想要一個地圖片段在另一個片段內嗎? 2.使用'getMapAsync',在回調中執行你的map init,並且不要保留'mGoogleMap',因爲在getMapAsync之外使用是不安全的。 –

+0

然後在哪裏使用getMapAsync?而我應該怎麼做呢? –

+1

使用'getMapAsync'而不是'getMap'請參閱[this](http://developer.android.com/reference/com/google/android/gms/maps/MapFragment.html#getMapAsync%28com.google.android.gms .maps.OnMapReadyCallback%29)。你可以擴展'SupportMapFragment'。 –

回答

5

地圖片段是您膨脹到另一個片段的佈局的一部分(我們稱之爲父級)。膨脹的片段成爲父片段的活動BUT的子片段NOT。你必須問父母片段的孩子片段管理器:

final SupportMapFragment myMAPF = (SupportMapFragment) getChildFragmentManager() 
     .findFragmentById(mapView);