【问题标题】:Saving marker on the map after app closes and retrieving it when opened again应用程序关闭后在地图上保存标记并在再次打开时检索它
【发布时间】:2014-08-12 03:04:31
【问题描述】:

我正在尝试在地图上添加标记,关闭我的应用程序,当打开标记时,标记将位于上次的位置。我正在尝试使用已保存的首选项来执行此操作,但我不完全理解它为什么不保存。

我的代码:

public void onClickMarker(){

    b1 = (Button) findViewById(R.id.button1);

    b1.setBackgroundResource(R.drawable.parkmycar);
    b1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            Location lastLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

            //-----------------------------------------------------------------//
            lat = lastLocation.getLatitude();
            lng =  lastLocation.getLongitude();

            SharedPreferences pref = getSharedPreferences("car coordinates",MODE_PRIVATE);
            Editor editor = pref.edit();
            editor.putLong("lat", Double.doubleToLongBits(lat));
            editor.putLong("lng", Double.doubleToLongBits(lng));
            editor.commit();

            SharedPreferences shared = getSharedPreferences("car coordinates",MODE_PRIVATE);
            double myLat = Double.longBitsToDouble(shared.getLong("lat", 0));
            double myLng = Double.longBitsToDouble(shared.getLong("lng", 0));

            //-----------------------------------------------------------------//
            LatLng currLatLng = new LatLng(myLat, myLng);


            if(carLoc!=null){
                carLoc.remove();
            }
            carLoc= map.addMarker(new MarkerOptions().position(currLatLng)
                    .title("your car location")
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.unnamed)));

            map.moveCamera(CameraUpdateFactory.newLatLngZoom(currLatLng, 17));
        }
    });
}

该方法在 onCreate 方法上被调用,并且当它确实将标记放置在当前位置时,但在应用关闭并再次打开后标记将不存在。

【问题讨论】:

  • 您是否在应用重启时获得了 lat long 值?
  • 不,我在应用重启时没有得到任何值。
  • 所以这意味着您的 sharedPreferences 不与 lat long 值一起存储
  • 获得纬度和经度值后,将它们存储在 SharedPreferences 中。在应用重新启动时,检查 SharedPreferences 中是否存在任何值 lat 和 long,如果存在,则使用它们来显示标记。
  • @aniruddha 这不是我在代码上所做的吗?

标签: android google-maps sharedpreferences google-maps-api-2


【解决方案1】:

你做到了

  • 从定位服务获取 lat&lng
  • 将 lat&lng 放入 SharePreferences
  • 从 SharePreferences 获取 lat&lng

所以我认为你总是从定位服务中获得新的 lat&lng,而不是你在 SharePreference 中输入的 lat&lng

你应该

  • 从 SharePreferences 获取 lat&lng
  • 如果它们等于 0 -> 从定位服务获取 lat&lng
  • 用 lat&lng 创建一个标记,然后显示 intto 地图
  • 将 lat&lng 放入 SharePreferences

【讨论】:

    【解决方案2】:

    您可以使用这些方法在 sharedPreferences 中保存双精度值,如下所示:

    Editor putDouble(final Editor edit, final String key, final double value) 
    {
       return edit.putLong(key, Double.doubleToRawLongBits(value));
    }
    

    并使用此方法检索:

    double getDouble(final SharedPreferences prefs, final String key, final double defaultValue)
    {
        return Double.longBitsToDouble(prefs.getLong(key, Double.doubleToLongBits(defaultValue)));
    }
    

    检查是否保存了 LatLng 的布尔值:

    boolean ifSaved = false;
    
     SharedPreferences pref = getSharedPreferences("car coordinates",MODE_PRIVATE);
       Editor editor = pref.edit();
       ifSaved = pref.getBoolean("ifLatLngSaved",true);
    
       if(ifSaved)
      {
       editor = putDouble(editor,"Lat",myLat);
       editor = putDouble(editor,"Lng",myLng);
       ifSaved = false;
       editor.putBoolean("ifLatLngSaved",ifSaved);     
       editor.commit();
       }
      else
    {
      double myPreviousLat = getDouble(pref,"myLat",0);
      double myPreviousLng = getDouble(pref,"myLng",0);
    }
    

    【讨论】:

    • 对于get doouble方法,0参数有什么作用?
    • 如果 sharedpreference 返回 null @guevarak12,这实际上是您传递的默认值
    • 参数 0 将我带到实际坐标 0,0 而不是我上次保存的坐标
    • 在保存坐标时设置一个布尔值,下次检查相同的布尔值以获取以前的坐标@guevarak12
    【解决方案3】:

    我把纬度和经度保存到字符串,我的保存方法:

        String latitude = String.valueOf(lat);
        String longitude = String.valueOf(lng);
        editor.putString("latitude", latitude);
        editor.putString("longitude", longitude);
    

    然后在我的 get 方法中获取它们:

        String latitude = preferences.getString("latitude", "");
        String longitude = preferences.getString("longitude", "");
        lat = Double.parseDouble(latitude);
        lng = Double.parseDouble(longitude);
    

    这对我来说很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2019-11-27
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      相关资源
      最近更新 更多