2015-02-17 2 views
1

я занимаюсь разработкой моего первого приложения и я создал следующую карту просмотра деятельности:Как добавить 2 слушателей к карте?

public class MapViewer extends Activity implements OnInfoWindowClickListener, ClusterManager.OnClusterClickListener<MyItem> { 

    private GoogleMap map; 
    private LatLng defaultLatLng = new LatLng(X, Y); 
    private int zoomLevel = 5; 
    private Database db = new Database(this); 
    private ClusterManager<MyItem> mClusterManager; 

    private LatLngBounds allowedBounds; 
    private final LatLng northeast = new LatLng(A, B); 
    private final LatLng southwest = new LatLng(C, D); 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mapviewer); 

     LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
     builder.include(northeast); 
     builder.include(southwest); 
     allowedBounds = builder.build(); 

     try { 
      map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
      if (map != null) { 
       map.setMyLocationEnabled(true); 
       map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
       map.getUiSettings().setRotateGesturesEnabled(false); 

       map.moveCamera(CameraUpdateFactory.newLatLngZoom(defaultLatLng, zoomLevel)); 

       mClusterManager = new ClusterManager<MyItem>(this, map); 
       mClusterManager.setRenderer(new MyClusterRenderer(this, map, mClusterManager)); 
       mClusterManager.setOnClusterClickListener(this); 

       map.setOnCameraChangeListener(mClusterManager); 
       map.setOnMarkerClickListener(mClusterManager); 

       map.setInfoWindowAdapter(new ClusterInfoWindow(getLayoutInflater())); 
       map.setOnInfoWindowClickListener(this); 

       addItems(); 
      } 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Как вы можете видеть, я установить слушателя на карту объект

map.setOnCameraChangeListener(mClusterManager); 

, который добавляет или удаляет кластеры на маркеры групп, в зависимости от уровня масштабирования. Теперь я хотел бы добавить слушателя, который проверяет, если пользователь перемещается по карте в некоторых пределах:

map.setOnCameraChangeListener(new OnCameraChangeListener() { 
    @Override 
    public void onCameraChange(CameraPosition cameraPosition) { 
     checkBounds(); 
    } 
}); 

Но это не работает. Он работает только в том случае, если я удаляю предыдущий слушатель (mClusterManager). Итак, как заставить обоих слушателей работать на одном и том же объекте карты?

Благодарим вас за ваши ответы и извините за мой английский.

ответ

2

Поскольку существует только метод set и метод add, вы можете установить только один прослушиватель за раз. Но вы могли бы делегировать от одного слушателя к другому, как это:

map.setOnCameraChangeListener(new OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { checkBounds(); mClusterManager.onCameraChange(cameraPosition); } });

Конечно mClusterManager не нужно реализовать интерфейс CameraChangeListener больше, но просто необходим публичный метод недействительным onCameraChange (CameraPosition cameraPosition).

+0

Спасибо! Это сработало! Я не понимаю, что вы сказали об интерфейсе ... – smartmouse

+0

На данный момент ваш ClusterManager реализует интерфейс OnCameraChangeListener. Я не знаю реализации, но sth вот так: 'public class ClusterManager расширяет SomeOtherClass реализует OnCameraChangeListener'. При моем подходе вы можете удалить «реализует OnCameraChangeListener'part, так как вы больше не устанавливаете этот класс в качестве слушателя. Но вы все равно сохраняете метод onCameraChange, поскольку вы вызываете его напрямую. – Alf

+0

Я ошибаюсь, если я сохраню реализацию? – smartmouse

Смежные вопросы