以编程方式创建 MapView 并添加标记导致片段中出现空指针异常
Programmatically Creating MapView and Adding a Marker Results in a null pointer exception in the fragment
我正在尝试以编程方式创建一个 MapView 并添加一个 MarkerPosition,如下所示:
MapView mapView = new MapView(getActivity());
((ViewGroup) rootView).addView(mapView);
GoogleMap googleMap = mapView.getMap();
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(
Double.parseDouble(
mEvent.getEventInfo().mEventData.mLat),
Double.parseDouble(
mEvent.getEventInfo().mEventData.mLng)))
.title("Marker"));
清单文件:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<permission
android:name="com.example.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.permission.MAPS_RECEIVE" />
我收到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
让您的 activity 实施 OnMapReadyCallback 并在 OnMapReady() 函数中添加标记。
参考:https://developers.google.com/maps/documentation/android-api/start
因为您的 googleMap 尚未加载,这意味着 null 并且您在其上添加了导致崩溃的标记。最好使用 mapView.getMapAsync(context);
而不是 mapView.getMap();
并实现此方法
@Override
public void onMapReady(final GoogleMap map) {
if(map != null){
// you are ready to add marker here
}
}
Google 地图现在应该异步加载,方法是将 MapFragment 添加到您的视图,然后对其进行处理。类似的东西会起作用:
public class MainActivity extends Activity implements OnMapReadyCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_activity);
MapView mapView = new MapView(this);
((LinearLayout) findViewById(R.id.mapWrapper)).addView(mapView);
mapView.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
map.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
}
采用这种布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapWrapper"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
事实证明,在 google 上播放服务版本 11.8.0
onCreatea()
和 onResume()
必须查看 MapView:
@Override public void setupMap(LatLng latLng) {
if (mapView == null) {
mapView = new MapView(getActivity());
rootLayout.addView(mapView);
mapView.onCreate(Bundle.EMPTY);
}
mapView.getMapAsync(map -> {
map.clear();
map.addCircle(MapUtil.makeDefaultGreenCircle(getActivity(), latLng));
});
}
@Override public void onResume() {
super.onResume();
mapView.onResume();
}
我正在尝试以编程方式创建一个 MapView 并添加一个 MarkerPosition,如下所示:
MapView mapView = new MapView(getActivity());
((ViewGroup) rootView).addView(mapView);
GoogleMap googleMap = mapView.getMap();
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(
Double.parseDouble(
mEvent.getEventInfo().mEventData.mLat),
Double.parseDouble(
mEvent.getEventInfo().mEventData.mLng)))
.title("Marker"));
清单文件:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<permission
android:name="com.example.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.permission.MAPS_RECEIVE" />
我收到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
让您的 activity 实施 OnMapReadyCallback 并在 OnMapReady() 函数中添加标记。
参考:https://developers.google.com/maps/documentation/android-api/start
因为您的 googleMap 尚未加载,这意味着 null 并且您在其上添加了导致崩溃的标记。最好使用 mapView.getMapAsync(context);
而不是 mapView.getMap();
并实现此方法
@Override
public void onMapReady(final GoogleMap map) {
if(map != null){
// you are ready to add marker here
}
}
Google 地图现在应该异步加载,方法是将 MapFragment 添加到您的视图,然后对其进行处理。类似的东西会起作用:
public class MainActivity extends Activity implements OnMapReadyCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_activity);
MapView mapView = new MapView(this);
((LinearLayout) findViewById(R.id.mapWrapper)).addView(mapView);
mapView.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
map.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
}
采用这种布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapWrapper"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
事实证明,在 google 上播放服务版本 11.8.0
onCreatea()
和 onResume()
必须查看 MapView:
@Override public void setupMap(LatLng latLng) {
if (mapView == null) {
mapView = new MapView(getActivity());
rootLayout.addView(mapView);
mapView.onCreate(Bundle.EMPTY);
}
mapView.getMapAsync(map -> {
map.clear();
map.addCircle(MapUtil.makeDefaultGreenCircle(getActivity(), latLng));
});
}
@Override public void onResume() {
super.onResume();
mapView.onResume();
}