android 支持地图片段:java.lang.NullPointerException
android SupportMapFragment : java.lang.NullPointerException
我在 map.setOnMyLocationChangeListener(myLocationChangeListener);
线上收到 java.lang.NullPointerException
。奇怪的是,在某些设备 运行 中出现此异常,而在某些设备中则不会。我该如何解决?
public class MyMap extends ActionBarActivity implements
RoutingListener, OnMapReadyCallback,
SensorEventListener {
// private GoogleApiClient mGoogleApiClient;
protected GoogleMap map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_map);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
if (mapFragment == null) {
mapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.map, mapFragment).commit();
}
mapFragment.getMapAsync(this);
map = mapFragment.getMap();
map.setOnMyLocationChangeListener(myLocationChangeListener);
}
编辑:
@Override
public void onMapReady(GoogleMap mMap) {
map = mMap;
mUiSettings = map.getUiSettings();
mUiSettings.setZoomControlsEnabled(true);
mUiSettings.setCompassEnabled(true);
updateMyLocation();
}
当您使用 GoogleMap
时,初始化需要时间。有时在某些设备上花费的时间比其他设备长。
要解决此问题,您应该延迟初始化 GoogleMap
对象。您可以遵循以下策略:
private Handler handler = new Handler();
private Runnable mapChecker = new Runnable() {
@Override
public void run() {
try {
if (mapFragment.getMap() != null) {
map = mapFragment.getMap();
map.setOnMyLocationChangeListener(myLocationChangeListener);
return;
}
} catch (Exception e) {
e.printStackTrace();
}
handler.postDelayed(mapChecker, 500);
}
};
然后从onCreate()
,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_map);
..........
handler.postDelayed(mapChecker, 500);
..........
}
通过调用 mapFragment.getMapAsync(this);
,我想您必须覆盖此方法 public void onMapReady(GoogleMap googleMap)
。在那里设置你的 mMap = googleMap
并在那里设置所有其他监听器。请记住,您的 Map 对象需要一些时间来初始化,这就是他们为您提供 getMapAsync
方法的原因。
已编辑:
请将此从您的 onCreated
中删除
map = mapFragment.getMap();
map.setOnMyLocationChangeListener(myLocationChangeListener);
并把 他们 map.setOnMyLocationChangeListener(myLocationChangeListener);
放在你的 onMapReady()
这一行 map = mMap
之后。请确认您的地图已初始化。
我在 map.setOnMyLocationChangeListener(myLocationChangeListener);
线上收到 java.lang.NullPointerException
。奇怪的是,在某些设备 运行 中出现此异常,而在某些设备中则不会。我该如何解决?
public class MyMap extends ActionBarActivity implements
RoutingListener, OnMapReadyCallback,
SensorEventListener {
// private GoogleApiClient mGoogleApiClient;
protected GoogleMap map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_map);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
if (mapFragment == null) {
mapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.map, mapFragment).commit();
}
mapFragment.getMapAsync(this);
map = mapFragment.getMap();
map.setOnMyLocationChangeListener(myLocationChangeListener);
}
编辑:
@Override
public void onMapReady(GoogleMap mMap) {
map = mMap;
mUiSettings = map.getUiSettings();
mUiSettings.setZoomControlsEnabled(true);
mUiSettings.setCompassEnabled(true);
updateMyLocation();
}
当您使用 GoogleMap
时,初始化需要时间。有时在某些设备上花费的时间比其他设备长。
要解决此问题,您应该延迟初始化 GoogleMap
对象。您可以遵循以下策略:
private Handler handler = new Handler();
private Runnable mapChecker = new Runnable() {
@Override
public void run() {
try {
if (mapFragment.getMap() != null) {
map = mapFragment.getMap();
map.setOnMyLocationChangeListener(myLocationChangeListener);
return;
}
} catch (Exception e) {
e.printStackTrace();
}
handler.postDelayed(mapChecker, 500);
}
};
然后从onCreate()
,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_map);
..........
handler.postDelayed(mapChecker, 500);
..........
}
通过调用 mapFragment.getMapAsync(this);
,我想您必须覆盖此方法 public void onMapReady(GoogleMap googleMap)
。在那里设置你的 mMap = googleMap
并在那里设置所有其他监听器。请记住,您的 Map 对象需要一些时间来初始化,这就是他们为您提供 getMapAsync
方法的原因。
已编辑:
请将此从您的 onCreated
map = mapFragment.getMap();
map.setOnMyLocationChangeListener(myLocationChangeListener);
并把 他们 map.setOnMyLocationChangeListener(myLocationChangeListener);
放在你的 onMapReady()
这一行 map = mMap
之后。请确认您的地图已初始化。