Android 使用SharedReferences仅保存一个标记,而不保存与该标记一起使用的图像

Android 使用SharedReferences仅保存一个标记,而不保存与该标记一起使用的图像,android,google-maps,Android,Google Maps,好的,我现在为我的地图实现了SharedReferences,以保存添加到地图中的所有标记,但是它似乎只保存一个标记?此外,标记上还有一个图像,因此当点击标记时,图像会显示出来,这也不会保存 所以我基本上只保存了一个标记,没有数据,其余的标记都被丢弃了 谁能给我指一下正确的方向吗 下面是我添加标记的时间: Marker marker = googleMap.addMarker(new MarkerOptions() .position(thePoint).icon(Bit

好的,我现在为我的地图实现了
SharedReferences
,以保存添加到地图中的所有标记,但是它似乎只保存一个标记?此外,标记上还有一个图像,因此当点击标记时,图像会显示出来,这也不会保存

所以我基本上只保存了一个标记,没有数据,其余的标记都被丢弃了

谁能给我指一下正确的方向吗

下面是我添加标记的时间:

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();
@Override
public void onMapLongClick(LatLng point) {
thePoint=point;

Marker marker = googleMap.addMarker(new MarkerOptions()
    .position(thePoint).icon(BitmapDescriptorFactory
         .fromResource(R.drawable.sighting_marker)));
markerId = marker.getId();

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,"bitmap").commit();
String markersfromprefs = prefs.getString("markers", null);
prefs.edit().putString("markers", markersfromprefs+","+markerId).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)));
对于通过
custoninfo窗口的
markerId

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)));
      }
     }
    
    然后在添加标记时:

    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();
    
    @Override
    public void onMapLongClick(LatLng point) {
    thePoint=point;
    
    Marker marker = googleMap.addMarker(new MarkerOptions()
        .position(thePoint).icon(BitmapDescriptorFactory
             .fromResource(R.drawable.sighting_marker)));
    markerId = marker.getId();
    
    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,"bitmap").commit();
    String markersfromprefs = prefs.getString("markers", null);
    prefs.edit().putString("markers", markersfromprefs+","+markerId).commit();
    

    您不能将数组保存在共享首选项中,或者至少您必须编写自己的代码来执行此操作。首选项是一对键值,因此必须使用多个键来保存数组。在这种情况下,您必须使用数据库,而不是使用共享首选项。

    共享引用将您的值存储为键值对。 你用这条线干什么

    prefs.edit().putString("Lat",String.valueOf(point.latitude)).commit();
    
    对系统说“给我存储一个带有point.latitude值的字符串并引用它,以便我以后可以用键'Lat'找到它”。 如果要使用共享首选项,则需要使用唯一键存储点。此时,您正在覆盖地图上每个点的键“Lat”和“Lng”引用的值


    您可以选择将所有点存储在一个数组中,并将该数组作为Json存储在首选项中

    你可以试试这样的方法:

    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(以字符串形式,例如以逗号分隔)

    要检索所有标记坐标,请执行以下操作:

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

    谢谢像SQlite?你会举一个例子吗?@Allrounder@Allrounder:这里有一个@greywolf82,编辑后的代码会工作吗,或者数据库是最好的选择?代码似乎没有保存添加的标记?@Allrounder和首选项完全是一团糟。它真的很难阅读和维护。请使用数据库存储位置信息和与标记相关的图像的URI或任何其他信息。请记住接受答案。Stackoverflow不是一个简单的论坛。太好了,非常感谢你,我非常感谢你的代码和解释!这一切都是有道理的,但现在它没有保存任何添加的标记?我已经用你提供的代码更新了我的问题。我想标记已经添加了,但是这一行:if((prefs.contains(“Lat_”)&&(prefs.contains(“Lng_”))将永远不会为真,因为你的prefs包含“Lat_2345”,例如,不仅仅是“Lat_u”好的,我明白了,但是如果我删除它,那么应用程序会崩溃,出现
    NullPointerException,如果我添加
    if((prefs.contains(“Lat_“+markerId”)&&(prefs.contains(“Lng_“+markerId”),`它似乎仍然无法保存标记。请尝试检查markersfromfresfs!=在尝试拆分它并添加点之前为null然后添加
    prefs=this.getSharedReferences(“LatLng”,MODE_PRIVATE);如果((预含物(“板条”+markerId)和&(预含物(“Lng”+markerId)));如果(markersfromprefs!=null){markersfromprefs=prefs.getString(“markers”,null);
    但似乎仍然没有保存标记。我做得对吗?