MapFragment在getMapAsync(this)方法中导致NullPointerException

我已经实现了一个在运行时添加MapFragment的活动。 MapFragment xml有静态fragment ,我试图在运行时添加。 另外我发现有一些问题在棒棒糖在运行时添加地图片段。 请检查问题提出和临时解决scheme

我也在下面给出了我的代码,

fragment_map.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".fragment.MapsFragment"> <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="appCreators.bloodfinder.activity.MapsActivity"/> <include android:id="@+id/layout" layout="@layout/template_custom_spinner"/> </FrameLayout> 

MapsFragment.java

onMapReadyCallback实现

 public class MapsFragment extends SupportMapFragment implements OnMapReadyCallback 

onResumecallback

 @Override public void onResume() { super.onResume(); ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); } 

这总是返回我空,我也试过了,

 ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); 

这也返回NullPointerException

MapsActivity.java

 getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer, MapsFragment.newInstance()).commit(); 

我将这个添加到Activitycallback的onCreate方法中。

我无法弄清楚为什么我仍然得到NullPointerException

有时我Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference

帮助将不胜感激!

更新:仍然没有解决我收到以下错误。 我看着日志,但不知道为什么会发生这种情况。

 Unable to resume activity {MapsActivity}: 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 "MapFragment在getMapAsync(this)方法中导致NullPointerException"

我通过观察SO中的给定答案,终于为自己解决了这个问题。 我比较了我的代码和答案中的代码。 在我看来,这个API有一些困惑,Google的实现非常广泛。 我得到了这个反复抛出的exception:

 Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference 

我仍然不知道这些实现中的一些错误是如何得到相同的exception,但是这对我来说是有效的,而且可能适用于其他人。

这些是你需要检查的事情:

  1. 确保你有这两个(我只有api关键元数据)

      <meta-data android:name="com.google.android.geo.API_KEY" android:value="@string/google_maps_key" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 
  2. 在xml中有一个像这样的片段,类属性如下所示是正确的

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

在我的情况下,地图片段是一个孩子,在另一个片段。

这个父段显然不应该是一个MapFragment或一个SupportMapFragment。 将它从SupportMapFragment更改为Fragment后,地图显示效果非常好。

 public class ParentFragment extends Fragment { 

我离开了一切,因为它是以前,而不是得到onCreateView中的地图我在onViewCreated像这样:

 @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.rewards_google_map_area); if (mapFragment != null) { LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); if (locationManager != null && mapFragment.getMap() != null) { googleMap=mapFragment.getMap(); //after this you do whatever you want with the map } } } 

我什么也没有改变,我没有乱搞rootView或parentView。 正如你会在@Konstantin Loginov的答案中看到的那样

试试看,让我知道。

前段时间我一直在处理类似的问题。 关键是在getMap()中恰当地onViewCreated()

 public class LocationFragment extends Fragment { private SupportMapFragment locationMap; private View rootView; protected View getFragmentView() { View view = getView(); if (view == null) { view = rootView; } return view; } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = getFragmentView(); if (rootView != null) { ViewGroup parent = (ViewGroup) rootView.getParent(); if (parent != null) { parent.removeView(rootView); } } try { rootView = inflater.inflate(R.layout.fragment_signup_specify_location, container, false); } catch (InflateException ex) { Log.e(LOG_TAG, "Inflate Exception in onCreateView; Caused by map fragment", ex); } ...... return getFragmentView(); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); locationMap = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.locationMap); if (locationMap != null) { LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); if (locationManager != null && locationMap.getMap() != null) { locationMap.getMap().setMyLocationEnabled(true); } } } } 

和它的XML看起来像你的:

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

然后,在onViewCreated()你可以通知Activity ,你的map-fragment已经可以使用了。

我希望,这有帮助

在我的情况下,我使用原始的MapView静态在一个Fragment的XML。 问题是我不得不将呼叫转移mMapView.onCreate(...) onViewCreated(...)因为在onCreate() mMapView尚未膨胀。 如果您不使用MapView那么您应该仔细检查您在哪一刻调用getMap() 。 我必须在内部MapView被充气之后。