2016-04-27 73 views
8

我想把地圖放到一個片段中。 我貼我使用谷歌地圖在一個片段內調用返回null

XML代碼

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

下面是我的片段名字聲明

public class ContactFragment extends MapFragment 

下面是我如何初始化地圖

private void initilizeMap() { 
    if (googleMap == null) { 

     if (googleMap == null) { 
      googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
        R.id.contactFrag_F_map)).getMap(); 
     } 
     // check if map is created successfully or not 
     if (googleMap == null) { 
      Toast.makeText(getActivity(), 
        "Sorry! unable to create maps", Toast.LENGTH_SHORT) 
        .show(); 
     } 
    } 
} 

這種方法被稱爲onCreateView

的錯誤是

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.MapFragment.getMap()' on a null object reference 

請幫助解決這個問題。問題是在下面部分

if (googleMap == null) { 
       googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
         R.id.contactFrag_F_map)).getMap(); 
      } 

EDIT 1

改變了XML來

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

public class ContactFragment extends SupportMapFragment 

而初始化

if (googleMap == null) { 
       googleMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
         R.id.contactFrag_F_map)).getMap(); 
      } 

但同樣的錯誤是

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 

,並在該行

if (googleMap == null) { 
        googleMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
          R.id.contactFrag_F_map)).getMap(); 
       } 

爲什麼會發生這種情況發生?

編輯2

是..的的GetMap已棄用。所以,我想

MapFragment mapFragment = (MapFragment) getChildFragmentManager().findFragmentById(R.id.contactFrag_F_map); 
     mapFragment.getMapAsync(this); 

和..

public class ContactFragment extends MapFragment implements OnMapReadyCallback { 

和回調..

@Override 
    public void onMapReady(GoogleMap googleMap) { 

     theGoogleMap = googleMap; 

     setUpMap(); 
    } 

和setUpMap方法

public void setUpMap(){ 

     theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     theGoogleMap.setMyLocationEnabled(true); 
     theGoogleMap.setTrafficEnabled(true); 
     theGoogleMap.setIndoorEnabled(true); 
     theGoogleMap.setBuildingsEnabled(true); 
     theGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
    } 

,誤差表示的onResume()

java.lang.RuntimeException: Unable to resume activity {com.purpletab.daga/com.purpletab.daga.activities.CoreActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference 

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference 
+1

請嘗試'getSupportFragmentmanager()'代替'getFragmentManager()' –

+0

http://stackoverflow.com/questions/25653898/google-maps-fragment-returning -null - 內 - 一個片段 –

+1

@Ruben請參閱有關的IntelliJ阿米亞·的答案 – Minto

回答

8

的解決方案。 我在片段內放置了一張地圖片段。

所以....

XML被放置在內部片段是

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

和..

public class ContactFragment extends Fragment implements OnMapReadyCallback { 

onCreateView()

MapFragment mapFragment = (MapFragment) getChildFragmentManager().findFragmentById(R.id.contactFrag_F_map); 
     mapFragment.getMapAsync(this); 

而且在OnMapReadyCallback

@Override 
    public void onMapReady(GoogleMap googleMap) { 

     theGoogleMap = googleMap; 

     setUpMap(); 
    } 

以下是setUpMap。

public void setUpMap(){ 

     theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     theGoogleMap.setMyLocationEnabled(true); 
     theGoogleMap.setTrafficEnabled(true); 
     theGoogleMap.setIndoorEnabled(true); 
     theGoogleMap.setBuildingsEnabled(true); 
     theGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
    } 

工作正常.. :)

+0

我有這個問題,但我不能很容易地轉換從SupportMapFragment到MapFragment。你認爲如果我轉換到MapFragment,它會起作用嗎? – ChickenFeet

5

不要

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

googleMap = ((MapFragment) getActivity().getSupportFragmentmanager().findFragmentById(
        R.id.contactFrag_F_map)).getMap(); 

getSupportFragmentManager

返回的FragmentManager與此次活動的相關 片段交互。

+1

評論那是一個點... –

+0

我使用的擴展AppCompact活動的活動。 該片段擴展了MapFragment。 所以它給我錯誤當我嘗試 googleMap =((MapFragment)getActivity()。getSupportFragmentmanager()。findFragmentById( R.id.contactFrag_F_map))。getMap(); – Minto

+0

檢查http://stackoverflow.com/questions/19353255/how-to-put-google-maps-v2-on-a-fragment-using-viewpager/26890034#26890034 –

0

在onCreateView

 mMapView.onCreate(savedInstanceState); 
     mMap = mMapView.getMap(); 
     mMap.getUiSettings().setMyLocationButtonEnabled(true); 
     mMap.setMyLocationEnabled(false); 

在XML

<com.google.android.gms.maps.MapView 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/tag_text_header" /> 
+0

我使用 編譯「com.google。 android.gms:發揮服務,地圖:8.4.0' – Minto

+0

是啊,我現在用的是相同的 –

0

首先,你這樣做是完全錯誤的,從一開始 - 見getMap

這種方法棄用。改爲使用getMapAsync(OnMapReadyCallback)。該回調方法爲您提供了一個GoogleMap實例,該實例保證爲非null並且可以使用。

第二 - 看起來(但我不確定)你不熟悉碎片嵌套,讀這個NestedFragments

1

嘗試使用下面的代碼:

private void initilizeMap() { 

    FragmentManager fm = getSupportFragmentManager(); 
    SupportMapFragment fragment = (SupportMapFragment) fm.findFragmentById(R.id.contactFrag_F_map); 
    if (fragment == null) { 
     fragment = SupportMapFragment.newInstance(); 
    } 
    mapView = fragment.getMap(); 
} 

在XML文件中:

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