I was following this tutorial to create something a little diffrent, this tutorial showed how the overlay works with predefined items inserted to it, but what if i want to dynamiclly add items to it? then I must start with an empty overlay:
Instead of :
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
which works just like as expected in the tutorial, I need to put this:
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);
which ommits the initializition of the overlay with an item.
this approach leads to the map getting stuck, and after few taps my app gets kicked out due to null exception.
1.is this expected behavior? it seems like a bug to me...
2.what do i do in order to acheive the expected behavior?(in which i can start with an empty overlay and add items to it dynamically)
And as for what i want to acheive, which is to not initiate the overlay with and item but to use addOverlay dynamically, this way i can
As far as I understand, under ItemOverlay you mean ItemizedOverlay. If so, you are on the right track. ItemizedOverlay is a container of map items, so every time you add/delete items from ItemizedOverlay you need to set last focused item to -1 and call populate() method to notify mapview about content change.
Just remember that you need to make changes in ItemizedOverlay content in a UI thread context ;)
There is also undocumented trick here. You need to set last focused index to -1 and do populate() even when you don't have items (so you need to do this on initialization stage)
So your code should look like:
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);
setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content
//now try to add new item
GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);
setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content
Related
In my application I have a map-activity which uses OSMDroid. I've managed to manually add markers with Overlay to display different locations but I want to implement a function where a marker will be created when you either double-tap or longpress.
I've scavenged the web for some kind of good explanation since I've troubles understanding the documentation of OSMDroid and their bonuspack.
Here is my relevant code:
public class Map extends Activity{
MapView mapView;
MapController mapController;
ArrayList<OverlayItem> overlayItemArray;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
mapView = (MapView) this.findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
mapView.setMultiTouchControls(true);
mapController = (MapController) mapView.getController();
mapController.setZoom(14);
GeoPoint startPoint = new GeoPoint(58.4109, 15.6216);
mapController.setCenter(startPoint);
// Create an ArrayList with overlays to display objects on map
overlayItemArray = new ArrayList<OverlayItem>();
// Create som init objects
OverlayItem linkopingItem = new OverlayItem("Linkoping", "Sweden",
new GeoPoint(58.4109, 15.6216));
OverlayItem stockholmItem = new OverlayItem("Stockholm", "Sweden",
new GeoPoint(59.3073348, 18.0747967));
// Add the init objects to the ArrayList overlayItemArray
overlayItemArray.add(linkopingItem);
overlayItemArray.add(stockholmItem);
// Add the Array to the IconOverlay
ItemizedIconOverlay<OverlayItem> itemizedIconOverlay = new ItemizedIconOverlay<OverlayItem>(this, overlayItemArray, null);
// Add the overlay to the MapView
mapView.getOverlays().add(itemizedIconOverlay);
}
I've a mapView on which I managed to get an overlay onLongPress with the help of GestureListener. What I actually want is, I want to add markers (with same icon) one by one. Like I want to mark different positions on map (not all at once). Any help with this would be great as am newbie with MapView and Overlays.
Use ItemizedOverlay class to add drawable on specific longitudes and latitudes.
In your MapActivity write
GeoPoint your_point = (Provide geopoint information here);
Drawable drawable =
this.getResources().getDrawable(R.drawable.your_point_image);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(
drawable, MapsActivity.this, mapView);
GeoPoint point = new GeoPoint((int) (your_point.getLat() * 1E6),
(int) (your_point.getLon() * 1E6));
OverlayItem overlayitem1 = new OverlayItem(your_point);
itemizedoverlay.addOverlay(overlayitem1);
mapView.getOverlays().add(itemizedoverlay);
Where
HelloItemizedOverlay extends ItemizedOverlay{
public HelloItemizedOverlay(Drawable defaultMarker, Activity context,
MapView mapView) {
super(boundCenterBottom(defaultMarker));
mContext = context;
this.mapView = mapView;
}
}
I did it this way and it works.
I am using the indoor positioning framework wifislam and have a programming question.
So far I have given a MapView by the indoorLocationView of WifiSLAM. I'm working with the following code.
final IndoorLocationManager.Configuration config = new IndoorLocationManager.Configuration();
indoorLocationManager = new IndoorLocationManager(this, config,
onServiceConnected, LOCATION_CHOICE);
indoorLocationView = indoorLocationManager.createLocationView(this,
GOOGLE_MAPS_API_KEY);
final View mapContainer = findViewById(R.id.mapcontainer);
((ViewGroup) mapContainer).addView(indoorLocationView.getView());
MapView mapView = indoorLocationView.getGoogleMapView();
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.pinred);
itemizedOverlay = new AddItemizedOverlay(drawable, mapView.getContext(), sm);
mapOverlays.add(itemizedOverlay);
and the AddItemizedOverlay has following methods:
#Override
public boolean onTap(GeoPoint geopoint, MapView mapView) {
mapOverlays.clear();
// geopoint = mapView.getProjection().fromPixels((int) event.getX(),
// (int) event.getY());
// latitude
if (geopoint != null) {
this.geopoint = geopoint;
lat = geopoint.getLatitudeE6();
// longitude
lon = geopoint.getLongitudeE6();
OverlayItem overlayitem = new OverlayItem(geopoint,
"Task Position", "Derzeitige Position vom Task");
this.addOverlay(overlayitem);
}
return false;
}
My problem is now, that the onTap method does not respond or react on touching on the device. As well the onTouch event has no reaction. I think those layers above of wifislam are preventing that I can reach the MapView. Is there any possibility to reach the MapView so I can add some markers on the map?
The reason for this is that there is a transparent view on top of the Google Maps view that is showing the floorplan. Try adding a listener on the view returned by IndoorLocationView#getView, but that may screw up the pinch-zoom/panning controls; you should double-check the effect (you probably want to return false from your listener unless one of your markers has been tapped).
If that doesn't work, your best bet is to contact WiFiSLAM support with your use case so they can update their SDK to meet your needs. Looks like there's a support email address in the FAQ topic of the help section of the SDK website.
I'm repeating the following code every x seconds in my MapActivity:
mapview.invalidate();
for (int i=0; i<mapview.getOverlays().size(); i++ )
{
mapview.getOverlays().remove(i);
}
mapview.getOverlays().clear();
List<Overlay> mapOverlays = mapview.getOverlays();
//set new geoponts here and add 2 markers via itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
mapview.invalidate();
Though I can see on the GUI that it's not refreshing the page, it's always drawing on top of it. It doesn't seem to clear the content before putting new stuff on.
Also using postinvalidate() doesn't work
Any idea what I'm doing wrong?
The reference of itemizedoverlay was not in that function, I moved it there and now it works.
i have a mapview and overlay items which when tap on shows popuo with text. what I want is when user taps on map outside of these overlay items or popup hide the popup if its currently visible.
The only way to do it (as I know), is adding new overlay to your map, witch serves as the popup. When you tap outside of the overlay, just remove it from overlay list.
This means you have to draw and handle events for your popup by yourself.
Ive been trying to acheive the same, this is exactly what i want :-
http://proxy.latest.xuemath.appspot.com/img?s=aR.1f.1be6ifej.2ec/_Fbk8IlxNQXM/S-ruq97dRWI/AAAAAAAAELY/s-o3onSReiU/s400/kml_google_maps_v3.bmp
i have implemented googleMapView with overlays, i have one issue i want to show a popup when clicked on each overlay, and when i click on another overlay the previous popus should disappear and new one should appear at the clicked location(ie projection points). And popup shouldnt appear when i click anywhere else on screen.Im using onTap event to record onclick. (map_overlay) is the layout that i want to show when someone click a projection point on the map. The code is below and map_overlay.xml could be any file.
Class: ItemizedOverlay:-
public boolean onTap(GeoPoint p, MapView mapView) {
LayoutInflater inflater = (LayoutInflater)cContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutParams lp = new MapView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT, p, LayoutParams.WRAP_CONTENT);
LinearLayout view = (LinearLayout)inflater.inflate(R.layout.map_overlay, null);
mapView.removeView(view);
mapView.invalidate();
mapView.addView(view,lp);
mapView.invalidate();
return true;
}
Below is the Main class in which im displaying projection points which is working fine and im calling I have implemented the onTap event in another class as shown above:
public class MapView extends MapActivity{
private ArrayList overlayItem ;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.large_mapview);
mapView = (MapView) findViewById(R.id.mapview);
// mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.mappointer2);
ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable,this);
OverlayItem overlayitem;
GeoPoint point;
double lat;
double lng;
for (int i = 0; i < overlayItem.size(); i++) {
lat = Double.parseDouble(overlayItem.get(i).getLatitude());
lng = Double.parseDouble(overlayItem.get(i).getLongitude());
point = new GeoPoint((int) (lat * 1E6),(int) (lng * 1E6));
overlayitem = new OverlayItem(point, i+"".toString(), overlayItem.get(i).getDetails().toString());
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}
mapView.invalidate();
}
}