在一个片段内调用的Google地图返回null

我正在试图把Map放在一个片段中。 我正在粘贴我正在使用的代码

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(); } 

编辑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 { 

和callback

 @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 

Solutions Collecting From Web of "在一个片段内调用的Google地图返回null"

解决scheme。 我正在放置一个片段内的地图片段

所以….

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); } 

工作正常.. :)

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

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

getSupportFragmentManager

返回FragmentManager用于与与此活动相关联的片段进行交互。

尝试使用下面的代码:

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

在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" /> 

首先你从一开始就做错了 – 参见getMap :

此方法已弃用。 改用getMapAsync(OnMapReadyCallback)。 callback方法为您提供了一个GoogleMap实例,保证它是非空的,可以使用。

其次 – 似乎(但我不确定)你不熟悉碎片嵌套,读这个NestedFragments 。