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

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

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

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

  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 …

 <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> 

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 } 

Solutions Collecting From Web of "Как я узнаю, что карта готова к использованию при использовании SupportMapFragment?"

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

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

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

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

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

Я закончил расширение класса 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. Я хотел, чтобы он вернулся к экземпляру Фрагмента. (GoogleMap был по существу фрагментом внутри фрагмента). Я настраиваю обратный вызов и программно загружаю карту с этим. Я хотел бы установить 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, который содержит фрагмент. В методе onCreateView этого фрагмента я создал SupportMapFragment, а затем добавил его в фрагмент через childFragmentManager. Я продолжал ссылаться на SupportMapFragment и ожидал, что он даст мне карту в onActivityCreated, которой она не была. Решение этой проблемы состояло в том, чтобы переопределить onActivityCreated из SupportMapFragment, но не родительский фрагмент. Я сделал это в 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 { ... } 

И при инициализации фрагмента:

 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 ();