1

这是我的代码在给定位置周围呈现100个标记,但不管我做什么,这些集群/标记都不会显示出来。我有一个疑问,如果该问题是与ClusterManager的初始化,mClusterManager = new ClusterManager<MarkerManager>(getActivity(), mMap);群集不适用于Android的谷歌地图。我究竟做错了什么?

从例如Google上显示hereClusterManager被初始化为mClusterManager = new ClusterManager<MyItem>(this, getMap());

但我的类从fragment继承,是getActivity返回错误上下文?我认为它期望com.example.mkallingal.mapapp3.MainActivity.PlaceholderFragment

你的帮助是非常感谢,我会标记为最佳答案,如果你要帮助我。谢谢。下面

是我的代码:

public static class PlaceholderFragment extends Fragment 
    { 
     public GoogleMap mMap; 
     private ClusterManager<MarkerManager> mClusterManager; 
     Context _MapContext; 

     private void setUpMapIfNeeded(View RootView) { 
      // Do a null check to confirm that we have not already instantiated the map. 
      if (mMap == null) { 


       FragmentActivity activity = (FragmentActivity)RootView.getContext(); 
       FragmentManager manager = activity.getSupportFragmentManager(); 
       Fragment x= manager.findFragmentById(R.id.container); 

       Fragment _ChildFragment= x.getChildFragmentManager().findFragmentById(R.id.map); 
       // Try to obtain the map from the SupportMapFragment. 
       mMap = ((SupportMapFragment) _ChildFragment) 
         .getMap(); 
       // Check if we were successful in obtaining the map. 
       if (mMap != null) { 
        clusterUp(5.293842, 101.682636); 
        } 
      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
      _MapContext= container.getContext(); 
      setUpMapIfNeeded(rootView); 
      return rootView; 
     } 

     private void clusterUp(double lat, double lng) 
     { 
      LatLng SYDNEY = new LatLng(5.415694, 101.678282); 
      LatLng MOUNTAIN_VIEW = new LatLng(lat,lng); 
      mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 15)); 
      mMap.animateCamera(CameraUpdateFactory.zoomIn()); 
      mMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 
      CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(MOUNTAIN_VIEW)  // Sets the center of the map to Mountain View 
        .build();     // Creates a CameraPosition from the builder 
      mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
      mMap.setOnCameraChangeListener(mClusterManager); 
      mMap.setOnMarkerClickListener(mClusterManager); 

      mClusterManager = new ClusterManager<MarkerManager>(getActivity(), mMap); 

      for (int i=0;i<100;i++){ 
       LatLng _NewLocation= getLocationNearCords(5.415694, 101.678282, 1000); //randomly generate 100 cordinates around the location 

       MarkerManager offsetItem = new MarkerManager(_NewLocation.latitude,_NewLocation.longitude); 
       mClusterManager.addItem(offsetItem); 
      } 
     } 

     public class MarkerManager implements ClusterItem { 
      private LatLng mPosition = new LatLng(22.2222, 33.3333); 

      public MarkerManager() { 

      } 

      public MarkerManager(double lat, double lng) { 
       mPosition = new LatLng(lat, lng); 
      } 

      @Override 
      public LatLng getPosition() { 
       return mPosition; 
      } 
     } 


    } 

回答

3

哎呦,我的坏,其中ClusterManager的初始化之前连接的事件处理程序,应该是这样,

mClusterManager = new ClusterManager<MarkerManager>(getActivity(), mMap); 
mMap.setOnCameraChangeListener(mClusterManager); 
mMap.setOnMarkerClickListener(mClusterManager); 

现在它的工作原理..

+1

有一点需要补充的是,现在不推荐使用setOnCameraChangeListener,而应该使用setOnCameraIdleListener。 –

+0

谢谢,非常有帮助的评论! –