Reputation: 141
I have setup a MapView in a PagerFragment in Android. I followed the Google Example but with V2 API to setup a Map with Clustered markers , it shows a black map to me with no markers. Where did I go wrong ?
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.maps.android.clustering.ClusterManager;
import MapUtils.CustomMarkerItem;
public class TabFragment2 extends Fragment implements OnMapReadyCallback {
MapView mMapView;
private GoogleMap googleMap;
private ClusterManager<CustomMarkerItem> mClusterManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.tab_fragment_2, container, false);
mMapView = (MapView) rootView.findViewById(R.id.mapView);
mMapView.onCreate(savedInstanceState);
mMapView.getMapAsync(TabFragment2.this);
return rootView;
}
@Override
public void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
@Override
public void onMapReady(GoogleMap googleMap) {
this.googleMap = googleMap;
if (ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
this.googleMap.setMyLocationEnabled(true);
setUpClusterer();
}
private void setUpClusterer() {
// Position the map.
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10));
// Initialize the manager with the context and the map.
// (Activity extends context, so we can pass 'this' in the constructor.)
mClusterManager = new ClusterManager<>(getContext(), googleMap);
googleMap.setOnMarkerClickListener(mClusterManager);
googleMap.setOnCameraIdleListener(mClusterManager);
// Add cluster items (markers) to the cluster manager.
addItems();
}
private void addItems() {
// Set some lat/lng coordinates to start with.
double lat = 51.5145160;
double lng = -0.1270060;
// Set the title and snippet strings.
String title = "This is the title";
String snippet = "and this would be it's explaination.";
// Add ten cluster items in close proximity, for purposes of this example.
for (int i = 0; i < 10; i++) {
double offset = i / 60d;
lat = lat + offset;
lng = lng + offset;
CustomMarkerItem offsetItem = new CustomMarkerItem(lat, lng, title, snippet);
mClusterManager.addItem(offsetItem);
}
}
}
Upvotes: 2
Views: 1827
Reputation: 165
I had the same problem. I had to put
mClusterManager.cluster()
after adding all the items and that fixed the problem for me.
Upvotes: 1
Reputation: 2009
@David please this Stackoverflow answer. It might help you to add marker. Or user this code for single marker(can use as per your requirement)
`Marker marker=`mMap.addMarker(new MarkerOptions().position(latLng).title("Your Location"));
marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.YOUR_IMAGE));//to set any image as marker
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));//for animate camera to your location
mMap.animateCamera(CameraUpdateFactory.zoomTo(15));//zoom camera to your location
and to cover all your marker (if more then one)
LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(startLocation.getLatLng());
builder.include(endLocation.getLatLng());
LatLngBounds bounds = builder.build();
int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, width, width, 20));
Upvotes: 0
Reputation: 11457
Problem is that you are passing wrong context to cluster instance ie getContext()
which should be getActivity()
.
Use getActivity()
when you initialize the instance
mClusterManager = new ClusterManager<>(getActivity(), googleMap);
and in basically use getActivity when you pass context in fragment class
if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Upvotes: 1