恢复 Activity - NullPointerException
Resume Activity - NullPointerException
我在恢复 activity 时遇到问题,当我打开它时我的应用程序崩溃了,我得到一个 NullPointerException,这很奇怪,因为我有一个 !=null 条件。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_maps);//frag
setContentView(R.layout.map_view);//linear
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
gotoLocation(51.508182, -0.140315, DEFAULT_ZOOM);
//mMap.setMyLocationEnabled(true);
}
@Override
protected void onResume(){
super.onResume();
MapStateManager mgr = new MapStateManager(this);
CameraPosition position = mgr.getSavedCameraPosition();
if(position != null){
CameraUpdate update = CameraUpdateFactory.newCameraPosition(position);
mMap.moveCamera(update);
}
}
错误在线mMap.moveCamera(更新);
MapStateManager.java
public class MapStateManager {
private static final String LONGITUDE = "longitude";
private static final String LATITUDE = "latitude";
private static final String ZOOM = "zoom";
private static final String BEARING = "bearing";
private static final String TILT = "tilt";
private static final String MAPTYPE = "MAPTYPE";
private static final String PREFS_NAME="mapCameraState";//definition for shared
private SharedPreferences mapStatePrefs;// save data on the device
public MapStateManager(Context context){
mapStatePrefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}
public void saveMapState(GoogleMap map){
SharedPreferences.Editor editor = mapStatePrefs.edit();
CameraPosition position = map.getCameraPosition();
editor.putFloat(LATITUDE, (float) position.target.latitude);
editor.putFloat(LONGITUDE, (float) position.target.longitude);
editor.putFloat(TILT, position.tilt);
editor.putFloat(ZOOM, position.zoom);
editor.putFloat(BEARING, position.bearing);
editor.commit();
}
public CameraPosition getSavedCameraPosition(){
double latitude = mapStatePrefs.getFloat(LATITUDE, 0);
double longitude = mapStatePrefs.getFloat(LONGITUDE, 0);
if (latitude==0){
return null;
}
LatLng target = new LatLng(latitude, longitude);
float zoom = mapStatePrefs.getFloat(ZOOM, 0);
float bearing = mapStatePrefs.getFloat(BEARING, 0);
float tilt = mapStatePrefs.getFloat(TILT, 0);
CameraPosition position = new CameraPosition(target, zoom, tilt, bearing);
return position;
}
}
您忘记检查 mMap
mMap 为空。您也不要在 oncreate 中调用 map,您可以使用界面进行调用。在 onResume 期间,它可以随时进入,不太可能(永远不会)。
您检查了 postion != null
,但 mMap
可能仍然为空(这就是正在发生的事情)。
在您的 onResume()
方法中,您需要重新获取地图,因为它可能在您的应用处于非活动状态时丢失。
尝试这样的事情:
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//Maybe move this to an else on the if below? I'm not sure exactly what this does
gotoLocation(51.508182, -0.140315, DEFAULT_ZOOM);
//Update to the saved position.
MapStateManager mgr = new MapStateManager(this);
CameraPosition position = mgr.getSavedCameraPosition();
if(position != null){
CameraUpdate update = CameraUpdateFactory.newCameraPosition(position);
mMap.moveCamera(update);
}
}
@Override
protected void onResume(){
super.onResume();
//Get the map asynchronously again.
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
我在恢复 activity 时遇到问题,当我打开它时我的应用程序崩溃了,我得到一个 NullPointerException,这很奇怪,因为我有一个 !=null 条件。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_maps);//frag
setContentView(R.layout.map_view);//linear
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
gotoLocation(51.508182, -0.140315, DEFAULT_ZOOM);
//mMap.setMyLocationEnabled(true);
}
@Override
protected void onResume(){
super.onResume();
MapStateManager mgr = new MapStateManager(this);
CameraPosition position = mgr.getSavedCameraPosition();
if(position != null){
CameraUpdate update = CameraUpdateFactory.newCameraPosition(position);
mMap.moveCamera(update);
}
}
错误在线mMap.moveCamera(更新);
MapStateManager.java
public class MapStateManager {
private static final String LONGITUDE = "longitude";
private static final String LATITUDE = "latitude";
private static final String ZOOM = "zoom";
private static final String BEARING = "bearing";
private static final String TILT = "tilt";
private static final String MAPTYPE = "MAPTYPE";
private static final String PREFS_NAME="mapCameraState";//definition for shared
private SharedPreferences mapStatePrefs;// save data on the device
public MapStateManager(Context context){
mapStatePrefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}
public void saveMapState(GoogleMap map){
SharedPreferences.Editor editor = mapStatePrefs.edit();
CameraPosition position = map.getCameraPosition();
editor.putFloat(LATITUDE, (float) position.target.latitude);
editor.putFloat(LONGITUDE, (float) position.target.longitude);
editor.putFloat(TILT, position.tilt);
editor.putFloat(ZOOM, position.zoom);
editor.putFloat(BEARING, position.bearing);
editor.commit();
}
public CameraPosition getSavedCameraPosition(){
double latitude = mapStatePrefs.getFloat(LATITUDE, 0);
double longitude = mapStatePrefs.getFloat(LONGITUDE, 0);
if (latitude==0){
return null;
}
LatLng target = new LatLng(latitude, longitude);
float zoom = mapStatePrefs.getFloat(ZOOM, 0);
float bearing = mapStatePrefs.getFloat(BEARING, 0);
float tilt = mapStatePrefs.getFloat(TILT, 0);
CameraPosition position = new CameraPosition(target, zoom, tilt, bearing);
return position;
}
}
您忘记检查 mMap
mMap 为空。您也不要在 oncreate 中调用 map,您可以使用界面进行调用。在 onResume 期间,它可以随时进入,不太可能(永远不会)。
您检查了 postion != null
,但 mMap
可能仍然为空(这就是正在发生的事情)。
在您的 onResume()
方法中,您需要重新获取地图,因为它可能在您的应用处于非活动状态时丢失。
尝试这样的事情:
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//Maybe move this to an else on the if below? I'm not sure exactly what this does
gotoLocation(51.508182, -0.140315, DEFAULT_ZOOM);
//Update to the saved position.
MapStateManager mgr = new MapStateManager(this);
CameraPosition position = mgr.getSavedCameraPosition();
if(position != null){
CameraUpdate update = CameraUpdateFactory.newCameraPosition(position);
mMap.moveCamera(update);
}
}
@Override
protected void onResume(){
super.onResume();
//Get the map asynchronously again.
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}