Search code examples
androidandroid-fragmentsoverlayopenstreetmaposmdroid

How to use Overlay for osmdroid with fragments


I've managed to run OSM and GMS in one app using fragments. And I know how to use markers (Overlay) in app using activities. I have a problem using Overlay for OSM in app with fragments, because to use OSM i need to create static class for it and ItemizedOverlay requires using getApplicationContext() method for ResourceProxy that can't be referenced from static context.

This is a working OSM class using fragments:

    public static class MapOSM extends Fragment{               // Klasa odpowiedzialna za fragment z mapą OSM

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){
        LinearLayout rl = (LinearLayout)inflater.inflate(R.layout.activity_osm, container, false);

        osmRl = (MapView) rl.findViewById(R.id.mapOsm2);
        osmRl.getTileProvider().setTileSource(TileSourceFactory.MAPNIK);

        return rl;
    }
}

And this i need to use to get Overlay working:

    ResourceProxy resourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
    myItemizedOverlay = new MyItemizedOverlay(marker, resourceProxy);
    map.getOverlays().add(myItemizedOverlay);

Thanks for any answer :)


Solution

  • So, thanks to "k3b", I'm posting my working OSM class using fragments, with 2 added markers.

    public static class MapOSM extends Fragment{               // Klasa odpowiedzialna za fragment z mapą OSM
    
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState){
            LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.activity_osm, container, false);
    
            osmRl = (MapView) ll.findViewById(R.id.mapOsm2);
            osmRl.getTileProvider().setTileSource(TileSourceFactory.MAPNIK);
    
            osmRl.setBuiltInZoomControls(true);
            osmRl.setMultiTouchControls(true);
    
            //Overlay
            MyItemizedOverlay myItemizedOverlay = null;
    
            IMapController mapController = osmRl.getController();
            mapController.setZoom(9);
            GeoPoint startPoint = new GeoPoint(54.792140, 18.402407);
            mapController.setCenter(startPoint);
    
            /// Markery na mapie
            Drawable marker=getResources().getDrawable(android.R.drawable.star_big_on);
            assert marker != null;
            int markerWidth = marker.getIntrinsicWidth();
            int markerHeight = marker.getIntrinsicHeight();
            marker.setBounds(0, markerHeight, markerWidth, 0);
    
            ResourceProxy resourceProxy = new DefaultResourceProxyImpl(getActivity().getApplicationContext());
    
            myItemizedOverlay = new MyItemizedOverlay(marker, resourceProxy);
            osmRl.getOverlays().add(myItemizedOverlay);
    
            GeoPoint myPoint1 = new GeoPoint(54.792140, 18.402407);
            myItemizedOverlay.addItem(myPoint1, "myPoint1", "myPoint1");
            GeoPoint myPoint2 = new GeoPoint(54.752, 18.422);
            myItemizedOverlay.addItem(myPoint2, "myPoint2", "myPoint2");
    
            return ll;
        }
    }
    

    Hope it helps someone:)