我想获取位置的经度和纬度坐标并保存在ArrayList中,然后将此列表提交到SharedPreference文件,这样当Map加载所有以前的位置时,可以使用来自SharedPreference文件的数据使用标记设置
我只知道SharedPreference只会存储原始数据类型而不存储数组。
我的问题是,是否有人知道通过共享pref技术或任何其他方式保留此数据的方法?
任何意见都赞赏。
答案 0 :(得分:3)
您可以将它们存储为以句点/逗号分隔的字符串。但是在纬度和经度的情况下,你不应该使用句号,因为它们有句号(纬度= 27 。 345)
例如
String aLocation = latitude + "," + longitude//store this to sharedpreference
这不会成为经度和纬度的问题,因为没有逗号(但有句号)可能与你的限制器发生冲突。
在检索位置时,您可以拆分它并获得相应的经度和纬度。
String[] locationArray = pref.getString(KEY_LOCATION, "").split(",");
String retrievedLat = locationArray[0];
String retrievedLong = locationArray[1];//you may need to use trim() method
您也可以将其转换为 JSON 并保存。但我更喜欢上述方法,因为它更容易,并且不会给您的方案带来任何问题。
但是如果您需要使用特殊字符(如句号)存储字符串,则需要将其设为JSON,因为它可能与您的限制器冲突
所以你可以这样做:
public void addToPref(LatLng location){//I'm supposing you are using LatLang class
String aLocation = location.getLatitude() + "," + location.getLongitude();
//and save to shared preference
}
<强>更新强>
如果要输入多个位置,则需要使用JSON(首选),但第一种方法更容易。 见下文
1. Get string from preference
2. Concatenate it with the new location
像:
oldLocation,newLocation,newerLocation
P.S。您可能拥有每个位置的经度和纬度,因此字符串必须类似于
{lat1,long1}:{lat2,lat2}:{lat3,long3}
在这种情况下,你需要有多个限制器并做(相应地拆分)。
使用拆分(&#34;:&#34;)方法会为您提供多个位置。
然后使用拆分(&#34;,&#34;)进一步拆分,它将为您提供相应的纬度和经度。
答案 1 :(得分:3)
1-创建一个类并放置您要存储的所有内容,例如arraylist
和latitude
的{{1}},并使该类实现longitude
接口。
Serializable
2-将其写入文件:
class MyBundle implements Serializable {
ArrayList<Double> mLat;
ArrayList<Double> mLan;
MyBundle( ArrayList<Double> latitude, ArrayList<Double> longitude ){
mLat = latitude;
mLan = longitude;
}
}
并取回所有内容:
ObjectOutputStream oos = null;
FileOutputStream fout = null;
try{
FileOutputStream fout = new FileOutputStream("Your file path");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(mb); // mb is an instance of MyBundle
} catch (Exception ex) {
e.printStackTrace();
}finally {
if(oos != null){
oos.close();
}
}
答案 2 :(得分:1)
我使用简单函数
使用这些方法// Saving GeoFence marker with prefs mng
private void saveGeofence() {
Log.d(TAG, "saveGeofence()");
SharedPreferences sharedPref = getPreferences( Context.MODE_PRIVATE );
SharedPreferences.Editor editor = sharedPref.edit();
editor.putLong( KEY_GEOFENCE_LAT, Double.doubleToRawLongBits( geoFenceMarker.getPosition().latitude ));
editor.putLong( KEY_GEOFENCE_LON, Double.doubleToRawLongBits( geoFenceMarker.getPosition().longitude ));
editor.apply();
}
// Recovering last Geofence marker
private void recoverGeofenceMarker() {
Log.d(TAG, "recoverGeofenceMarker");
SharedPreferences sharedPref = getPreferences( Context.MODE_PRIVATE );
if ( sharedPref.contains( KEY_GEOFENCE_LAT ) && sharedPref.contains( KEY_GEOFENCE_LON )) {
double lat = Double.longBitsToDouble( sharedPref.getLong( KEY_GEOFENCE_LAT, -1 ));
double lon = Double.longBitsToDouble( sharedPref.getLong( KEY_GEOFENCE_LON, -1 ));
LatLng latLng = new LatLng( lat, lon );
markerForGeofence(latLng);
drawGeofence();
}
}