【问题标题】:Google maps api how to save data during rotation screen?谷歌地图api如何在旋转屏幕期间保存数据?
【发布时间】:2019-02-27 00:58:04
【问题描述】:

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

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

【问题讨论】:

    标签: java android google-maps


    【解决方案1】:

    在初始化 mGoogleMap 变量并删除 onRestoreInstanceState 方法后,将恢复代码移至 onCreate。

    问题是在调用 onRestoreInstanceState 时,您的 mGoogleMap 变量为空。

    【讨论】:

    • 但我的 mGoogleMap 已在 onMapReady() 中初始化,我无法获取 savedInstanceState
    • 所以只需在外部声明 lat、lot 和 zoom 变量作为类成员,然后在地图初始化后在 onMapReady() 内部使用它们。
    • 我做到了,但它不再起作用了。这有什么问题?
    • 我一直在测试我的新代码,它可以正常工作,但我的相机没有移动到我最后的位置。为什么?我试图在 resetDataOnMap() 方法中添加一个标记,它被设置在最后一个位置。所以,摄像机为什么不移到那个地方呢?
    • 试试 mGoogleMap.animateCamera。另请阅读stackoverflow.com/a/34117053/1860868
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多