java - 谷歌地图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)
你能帮我解决我的问题吗?
解决方案
解决我的问题的新方法,为什么它不起作用?:
// 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));
}
}
推荐阅读
- reactjs - 使用打字稿将自定义道具传递给反应组件
- postgresql - 是否可以停止 AWS Postgres Aurora 全球数据库?
- php - 每次在管理页面编辑帖子时,如何防止上传图片?
- java - 有没有办法将 VisualVM 附加到由 AWS SAM local 运行的 java lambda 函数
- java - Reactor - 如何将找到和未找到的实体收集到地图中,以 id 为键?
- c# - WPF - 设置字体大小以适合文本框
- ruby-on-rails - RSpec 请求测试
- typescript - 异步函数错误:“键入'Promise
[]' 不可分配给类型 'MyType[]' " - c++ - c++算法为什么会出现无限循环
- javascript - 回调函数中的 JS 语法(nodejs、express、passport)