好的,所以我现在为我的地图实现sharedPreferences
以保存添加到地图中的所有标记,但是它似乎只保存一个标记?此外,标记还有一个图像,因此当点击标记显示图像时,也不会保存。
所以我基本上最终会保存一个没有数据的标记,其余标记将被丢弃。
有人可以指出我正确的方向吗?
这是我添加标记的时候:
Marker marker = googleMap.addMarker(new MarkerOptions()
.position(thePoint).icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_marker)));
markerId = marker.getId();
prefs.edit().putString("Lat",String.valueOf(point.latitude)).commit();
prefs.edit().putString("Lng",String.valueOf(point.longitude)).commit();
然后这是我在活动再次开始时检索标记的时间:
String lat = prefs.getString("Lat","");
String lng = prefs.getString("Lng","");
LatLng l =new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
googleMap.addMarker(new MarkerOptions()
.position(l).icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_marker)));
对于markerId
的{{1}}:
custonInfoWindow
总结一下:
我做错了什么?
修改
这是我更新的代码:
View v = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
final ImageView markerIcon = (ImageView) v.findViewById(R.id.marker_icon);
Bitmap bitmap = myMarkersHash.get(marker.getId());
markerIcon.setImageBitmap(bitmap);
然后添加标记时:
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
prefs = this.getSharedPreferences("LatLng",MODE_PRIVATE);
if((prefs.contains("Lat_")) && (prefs.contains("Lng_")))
{
String markersfromprefs = prefs.getString("markers", null);
String [] markerIds = markersfromprefs.split(",");
for(String markerId : markerIds){
String lat = prefs.getString("Lat_"+markerId,"");
String lng = prefs.getString("Lng_"+markerId,"");
LatLng l =new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
googleMap.addMarker(new MarkerOptions()
.position(l).icon(BitmapDescriptorFactory
.fromResource(R.drawable.sighting_marker)));
}
}
答案 0 :(得分:1)
您无法在共享首选项中保存数组,或者至少您必须编写自己的代码才能执行此操作。首选项是一个键值 - 因此您必须使用多个键来保存数组。在这种情况下,您必须使用数据库而不是使用共享首选项。
答案 1 :(得分:0)
共享引用将您的值存储为键值对。 你在用线做什么
prefs.edit().putString("Lat",String.valueOf(point.latitude)).commit();
对系统说“向我存储一个带有point.latitude值的字符串并引用它,以便我稍后可以使用”Lat“键找到它。 如果要使用共享首选项,则需要使用唯一键存储点。目前,您正在覆盖“Lat”和“Lat”键引用的值。 “Lng”表示地图上的每个点。
对您开放的一个选项是将所有点存储在数组中,并将此数组作为Json存储在首选项中。
答案 2 :(得分:0)
你可以尝试类似的东西:
Marker marker = googleMap.addMarker(new MarkerOptions()
.position(thePoint).icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_marker)));
markerId = marker.getId();
//markerId is added to the name of sharedPreferences
prefs.edit().putString("Lat_"+markerId,String.valueOf(point.latitude)).commit();
prefs.edit().putString("Lng_"+markerId,String.valueOf(point.longitude)).commit();
对于自定义图像,同样的事情:
prefs.edit().putString("image_"+markerId,"your_image_reference").commit();
然后你只需要存储每个标记Id(在一个字符串中,例如用逗号分隔)
String markersfromprefs = prefs.getString("markers", null);
prefs.edit().putString("markers", markersfromprefs+","+markerId).commit();
要检索所有标记坐标:
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
prefs = this.getSharedPreferences("LatLng",MODE_PRIVATE);
String markersfromprefs = prefs.getString("markers", null);
if (markersfromprefs != null){
String [] markerIds = markersfromprefs.split(",");
for(String markerId : markersId){
String lat = prefs.getString("Lat_"+markerId,"");
String lng = prefs.getString("Lng_"+markerId,"");
LatLng l =new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
googleMap.addMarker(new MarkerOptions()
.position(l).icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_marker)));
}
}