Как узнать, что карта готова к использованию при использовании 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?
На самом деле карта отображается на телефоне, однако мне кажется, что нам не удастся получить ссылку на добавление маркеров.
- Google Maps V3 - путевые точки + инфо-окно со случайным текстом
- Не удается разрешить метод getMap ()
- Неверный показ Google Карты Infowindow
- Как сделать полупрозрачный слой PNG в Google Maps в IE8?
- Создание ключа API для открытия карты Google
ОБНОВИТЬ:
Причина, по которой я создавала 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 }
- NoClassDefFoundError в библиотеке V2 для Google Play Services
- Как я могу создать приложение Android в Android Studio, которое использует Google Maps Api v2?
- Карты Google и Richfaces 3.3.3 (prototype.js 1.6.0.3) Возможная несовместимость
- Удалить маркер из GoogleMap
- Как реализовать поиск в Google Maps по адресу в Android?
- Android Studio - карта Google по-прежнему пуста на реальном устройстве Android в выпуске apk
- Как реализовать перетаскиваемую карту, например, uber android, Update with change location
- API Карт Google: заголовок «Access-Control-Allow-Origin» отсутствует на запрошенном ресурсе
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 ();