Как узнать, что карта готова к использованию при использовании SupportMapFragment?

В методе onCreate я использую SupportMapFragment для отображения карты.

  SupportMapFragment fragment = new SupportMapFragment(); getSupportFragmentManager().beginTransaction() .add(android.R.id.content, fragment).commit(); 

В связи с этим я хотел бы добавить маркер. Проблема в том, когда вызов getMap равен null, когда я могу попробовать еще раз? Есть ли какое-то событие, которое я могу зарегистрировать или это мой подход сам по себе не так?

  mMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap(); if(mMap == null) //what do I do here? 

На самом деле карта отображается на телефоне, однако мне кажется, что нам не удастся получить ссылку на добавление маркеров.

ОБНОВИТЬ:

Причина, по которой я создавала SupportMapFragment через конструктор, SupportMapFragment с тем, что типичный setContentView рушился и не работал. Это поставило меня в затруднительное положение, когда я не смог получить свою ссылку в методе onCreate так как в то время я фактически создавал SupportMapFragment . В дальнейших исследованиях, похоже, мой вопрос setContentView был побочным продуктом, когда у него не было как setContentView Google-play-services, так и модуль / src, настроенный как часть общего проекта. После этого, setContentView теперь работает, и я могу получить ссылку через getMap() как и следовало ожидать.

lots.xml …

   

LotsActivity.java …

 public class LotsActivity extends FragmentActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lots); GoogleMap mMap; mMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap(); if(mMap == null) //this should not occur now } 

EDIT: getMap устарел сейчас

Проблема в том, когда вызов getMap равен null, когда я могу попробовать еще раз?

Это зависит от характера проблемы.

Если вы настроили SupportMapFragment помощью элемента в макете, вы можете вызвать getMap() успешно в onCreate() . Но если вы создадите SupportMapFragment через конструктор, это слишком рано – GoogleMap еще не существует. Вы можете расширить SupportMapFragment и переопределить onActivityCreated() , поскольку getMap() готов к этому.

Однако getMap() также может возвращать значение null для большей проблемы, например, не устанавливать Google Play Services. Вам нужно будет использовать что-то вроде GooglePlayServicesUtil.isGooglePlayServicesAvailable() чтобы обнаружить это условие и справиться с ним, как вам угодно.

Я закончил расширение classа SupportMapFragment и использовал обратный вызов. Код находится здесь:

 public class MySupportMapFragment extends SupportMapFragment { public MapViewCreatedListener itsMapViewCreatedListener; // Callback for results public abstract static class MapViewCreatedListener { public abstract void onMapCreated(); } @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); // Notify the view has been created if( itsMapViewCreatedListener != null ) { itsMapViewCreatedListener.onMapCreated(); } return view; } } 

Я предпочел бы использовать интерфейс и переопределить метод onAttach (activity), но в моем случае я не хотел, чтобы callback возвращался к моей MainActivity. Я хотел, чтобы он вернулся к экземпляру Fragment. (GoogleMap был по существу fragmentом внутри fragmentа). Я настраиваю обратный вызов и программно загружаю карту с этим. Я хотел бы установить itsMapViewCreatedListener внутри конструктора MySupportMapFragment, но использование чего-либо, кроме конструкторов без параметров, не рекомендуется.

 itsMySupportMapFragment = new MySupportMapFragment(); MapViewCreatedListener mapViewCreatedListener = new MapViewCreatedListener() { @Override public void onMapCreated() { initPlacesGoogleMapCtrl(); } }; itsMySupportMapFragment.itsMapViewCreatedListener = mapViewCreatedListener; FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.mapFragmentContainer, itsMySupportMapFragment); transaction.addToBackStack(null); transaction.commit(); 

И затем, когда я позвоню, я могу получить карту; не более null!

 public void initPlacesGoogleMapCtrl() { // Map ready, get it. GoogleMap googleMap = itsMySupportMapFragment.getMap(); // Do what you want... } 

Я бы прокомментировал ответ CommonsWare, но у меня недостаточно отзывов. В любом случае, у меня также была эта проблема: getMap () вернет null в onActivityCreated. Моя настройка такова: у меня есть MainActivity, которая содержит fragment. В методе onCreateView этого fragmentа я создал SupportMapFragment, а затем добавил его к fragmentу через childFragmentManager. Я продолжал ссылаться на SupportMapFragment и ожидал, что он даст мне карту в onActivityCreated, которой она не была. Решение этой проблемы состояло в том, чтобы переопределить onActivityCreated из SupportMapFragment, но не родительский fragment. Я сделал это в onCreateView:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_location, container, false); mMapFragment = new SupportMapFragment() { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mMap = mMapFragment.getMap(); if (mMap != null) { setupMap(); } } }; getChildFragmentManager().beginTransaction().add(R.id.framelayout_location_container, mMapFragment).commit(); return v; } 

В прошлом месяце (декабрь 2014 года) Google официально разрешил эту проблему. В новейших (6.5) службах Google Play :

Метод getMap () в MapView и MapFragment теперь устарел в пользу нового метода getMapAsync ().

С помощью getMapAsync(OnMapReadyCallback callback) вы можете настроить прослушиватель, когда GoogleMap готов. Он передается в обратном вызове и предоставляется непустым.

Google предоставил образец кода для этого:

 public class MainActivity extends FragmentActivity implements OnMapReadyCallback { ... } 

и при инициализации fragmentа:

 MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(this); 

когда карта будет готова, вы получите обратный вызов

 @Override public void onMapReady(GoogleMap map) { map.addMarker(new MarkerOptions() .position(new LatLng(0, 0)) .title("Marker")); } 

Вы также можете использовать MapsInitializer.initialize(context); если проблема связана с тем, что библиотеки не инициализируются.

С помощью последних GoogleServices вы можете использовать MapFragment.getMapAsync . Непосредственно из документов

Устанавливает объект обратного вызова, который будет запускаться, когда экземпляр GoogleMap готов к использованию.

если map == null, то найдите карту

  if (mGoogleMap == null) { SupportMapFragment mapFragment1 = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment1.getMapAsync(this); } 

а затем вызовите функцию onMapReady ();

  • Контроль масштабирования и уличный обзор не отображаются на моей карте Google?
  • Превышение 23 путевой точки на каждый запрос в API Google Directions (уровень бизнеса / работы)
  • Добавить схему «Область поиска» на результат Google Maps
  • Как установить местоположение по умолчанию и уровень масштабирования для google map api v2?
  • API Google Map - удаление маркеров
  • Как нарисовать направления дороги между двумя геокодами в android google map v2?
  • Встраивание карт Google в приложение для Java-приложений
  • API Карт Google V3: как показать направление от точки A до точки B (синяя линия)?
  • Как удалить маркеры по умолчанию?
  • Импорт библиотеки google-play-service, показывающей красный X рядом с этим справочным андроидом
  • Google Maps, открыть информационное окно после щелчка по ссылке
  • Давайте будем гением компьютера.