首页 > 解决方案 > 谷歌地图api如何在旋转屏幕期间保存数据?

问题描述

我正在开发应用程序,并且我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) 

你能帮我解决我的问题吗?

标签: javaandroidgoogle-maps

解决方案


解决我的问题的新方法,为什么它不起作用?:

 // 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));
    }
}

推荐阅读