在列表中存储标记位置
Posted
技术标签:
【中文标题】在列表中存储标记位置【英文标题】:Storing marker locations in list 【发布时间】:2015-10-19 10:15:33 【问题描述】:我正在使用 onmapclicklistener 在谷歌地图上添加标记并以相同的方式删除它。我想要的是,当用户添加标记时,它的位置和半径将保存在列表中(半径取自对话框片段中的用户),当用户删除标记时,它也应该从列表中删除。我应该使用什么方法。 我的代码是 公共类 MainActivity 扩展 FragmentActivity 实现 View.OnClickListener,MapDropdown.DialogListener
public static final String mapLongitude="longitude";
public static final String mapLatitude="latitude";
FragmentManager fm = getSupportFragmentManager();
Button displayareas;
Switch deleteareas;
private boolean del = false;
private GoogleMap newmap; // Might be null if Google Play services APK is not available.
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayareas = (Button) findViewById(R.id.display);
displayareas.setOnClickListener(this);
deleteareas = (Switch) findViewById(R.id.delete);
deleteareas.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked)
if (isChecked)
del = true;
Toast.makeText(getApplicationContext(), "Deleting enabled", Toast.LENGTH_LONG).show();
else
del = false;
Toast.makeText(getApplicationContext(), "Deleting disabled", Toast.LENGTH_LONG).show();
);
Log.d("Map","MapCreated");
setUpMapIfNeeded();
@Override
public void onClick(View v)
if (v.getId() == R.id.display)
Intent intent = new Intent(this, AllAreas.class);
startActivity(intent);
@Override
protected void onResume()
super.onResume();
//setUpMapIfNeeded();
private void setUpMapIfNeeded()
// Do a null check to confirm that we have not already instantiated the map.
if (newmap == null)
// Try to obtain the map from the SupportMapFragment.
newmap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (newmap != null)
setUpMap();
Log.d("MAPS","Map working");
else Log.d("MAPS","not working");
private void setUpMap()
newmap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));
// Enable MyLocation Layer of Google Map
newmap.setMyLocationEnabled(true);
// Get LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Create a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Get the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Get Current Location
Location myLocation = locationManager.getLastKnownLocation(provider);
// set map type
newmap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
// Get latitude of the current location
double latitude = myLocation.getLatitude();
// Get longitude of the current location
double longitude = myLocation.getLongitude();
// Create a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
// Show the current location in Google Map
newmap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
newmap.animateCamera(CameraUpdateFactory.zoomTo(20));
newmap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My location"));
Log.d("LATITUDE",String.valueOf(latitude));
Log.d("LONGITUDE",String.valueOf(longitude));
GoogleMap.OnMarkerClickListener listener = new GoogleMap.OnMarkerClickListener()
@Override
public boolean onMarkerClick(final Marker marker)
if(del == false)
MapDropdown dFragment = new MapDropdown();
// Show DialogFragment
dFragment.show(fm, "Dialog Fragment");
else if(del == true)
marker.remove();
return true;
;
newmap.setOnMarkerClickListener(listener);
newmap.setOnMapClickListener(new GoogleMap.OnMapClickListener()
@Override
public void onMapClick(LatLng latLng)
// Creating a marker
MarkerOptions markerOptions = new MarkerOptions();
// Setting the position for the marker
markerOptions.position(latLng);
// Setting the title for the marker.
// This will be displayed on taping the marker
markerOptions.title(latLng.latitude + " : " + latLng.longitude);
// Animating to the touched position
newmap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
// Placing a marker on the touched position
Marker mmarker = newmap.addMarker(markerOptions);
Log.d("ADDED LATITUDE",String.valueOf(latLng.latitude));
Log.d("ADDED LONGITUDE",String.valueOf(latLng.longitude));
Toast.makeText(getApplicationContext(),"Block area updated",Toast.LENGTH_LONG).show();
);
@Override
public void onDialogPositiveClick(DialogFragment dialog)
Log.d("Button","positive");
@Override
public void onDialogNegativeClick(DialogFragment dialog)
Log.d("Button","negative");
【问题讨论】:
【参考方案1】:如果您想在应用重新打开时检索列表。您可以使用location file system
来存储列表。
首先,如果您想同时保存location
和radius
,您可以为此创建一个名为UserLocation
的对象。
当用户创建标记时,第二次为该对象创建一个名为items
的Arraylist
,将该对象添加到Arraylist
。然后使用以下方法保存Arraylist
:
private void writeItems()
File fileDir = getFilesDir();
File locationFile = new File(fileDir, "locations.txt");
try
FileUtils.writeLines(locationFile, items);
catch (IOException e)
e.printStackTrace();
最后,您可以使用以下方法检索数据:
private void readItems()
File filesDir = getFilesDir();
File locationFile = new File(filesDir, "locations.txt");
try
items = new ArrayList<UserLocation>(FileUtils.readLines(locationFile));
catch (IOException e)
items = new ArrayList<locationFile>();
【讨论】:
以上是关于在列表中存储标记位置的主要内容,如果未能解决你的问题,请参考以下文章
五线谱调号 ( 调号标识位置 | 调号标记列表 | A 大调标识原理 | FCG 位置标记升号 # | F 大调标识原理 | B 位置标记降号 b )