我正在开发应用程序,并且我有MapActivity
,这里有地图。我想在旋转屏幕期间保存数据(最后一个坐标,缩放),然后尝试使用这种方式
private GoogleMap mGoogleMap;
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// saving the last zoom, coordinates
double lat = mGoogleMap.getCameraPosition().target.latitude;
double lon = mGoogleMap.getCameraPosition().target.longitude;
float zoom = mGoogleMap.getCameraPosition().zoom;
savedInstanceState.putDouble("map_lat", lat);
savedInstanceState.putDouble("map_lon", lon);
savedInstanceState.putFloat("map_zoom", zoom);
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// get the last zoom, coordinates
double lat = savedInstanceState.getDouble("map_lat");
double lon = savedInstanceState.getDouble("map_lon");
LatLng latLng = new LatLng(lat, lon);
float zoom = savedInstanceState.getFloat("map_zoom", 15);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));
}
但是此代码不起作用。我遇到下一个错误
2019-02-26 17:41:15.529 20867-20867/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2019-02-26 17:41:15.529 20867-20867/? E/libpersona: scanKnoxPersonas
2019-02-26 17:41:15.529 20867-20867/? E/libpersona: Couldn't open the File - /data/system/users/0/personalist.xml - No such file or directory
2019-02-26 17:41:21.286 20867-20867/com.example.mapsapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mapsapp, PID: 20867
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mapsapp/com.example.mapsapp.activities.MapActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4921)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6942)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference
at com.example.mapsapp.activities.MapActivity.onRestoreInstanceState(MapActivity.java:99)
at android.app.Activity.performRestoreInstanceState(Activity.java:1108)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1267)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2930)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4921)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6942)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
您能帮我解决我的问题吗?
答案 0 :(得分:0)
在初始化mGoogleMap变量后,将还原代码移至onCreate并删除onRestoreInstanceState方法。
问题在于调用onRestoreInstanceState时,您的mGoogleMap变量为null。
答案 1 :(得分:0)
一种解决我的问题的新方法,为什么它不起作用?:
// the last data before rotation the screen
private float mLastZoom = 0;
private LatLng mLastLatLng = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SupportMapFragment supportMapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
supportMapFragment.getMapAsync(this);
// restore data after rotation
if (savedInstanceState != null) {
double lat = savedInstanceState.getDouble("map_lat");
double lon = savedInstanceState.getDouble("map_lon");
mLastLatLng = new LatLng(lat, lon);
mLastZoom = savedInstanceState.getFloat("map_zoom");
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// saving the last zoom, coordinates
double lat = mGoogleMap.getCameraPosition().target.latitude;
double lon = mGoogleMap.getCameraPosition().target.longitude;
float zoom = mGoogleMap.getCameraPosition().zoom;
savedInstanceState.putDouble("map_lat", lat);
savedInstanceState.putDouble("map_lon", lon);
savedInstanceState.putFloat("map_zoom", zoom);
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
resetDataOnMap();
}
private void resetDataOnMap() {
if (mLastLatLng != null && mLastZoom != 0) {
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLastLatLng, mLastZoom));
}
}