Подтвердить что ты не робот

Как рекомендуется использовать Google Map v2 внутри фрагмента?

Я хочу добавить карту внутри фрагмента с настраиваемой компоновкой.

  • Я могу сделать это с помощью ChildFragmentManager, который добавит SupportMapFragment. Этот подход в настоящее время используется. Однако это имеет недостаток, поскольку транзакция дочернего фрагмента является асинхронной и ее трудно гарантировать, что getMap не вернет null.
  • Другим способом является расширение SupportMapFragment storeViewView от super onCreateView

    mapView = super.onCreateView(inflater, container, savedInstanceState);

    и вставка его в раздутую компоновку. Первичная проблема заключается в том, что затем фрагмент пытается восстановить из сохраненного состояния SDK Google Maps изнутри.

Есть ли другой способ решить эту проблему. Было бы здорово, если кто-то из команды Google Map порекомендует правильный подход, потому что вы не включили ничего подобного этому в образцы.

4b9b3361

Ответ 1

Все FragmentTransaction являются асинхронными. Если вы хотите, чтобы ваша транзакция произошла немедленно, вам придется принудительно их пропустить:

getChildFragmentManager().beginTransaction.add(R.id.container, new MyMapFragment(), "MyMapFragment").commit();
getChildFragmentManager().executePendingTransactions();
/* getMap() should not return null here */

От Сайт разработчика Android:

После того, как FragmentTransaction зафиксировано с помощью FragmentTransaction.commit(), его планируется выполнить асинхронно в основном потоке процесса. Если вы хотите немедленно выполнить любые такие ожидающие операции, вы можете вызвать эту функцию (только из основного потока), чтобы сделать это. Обратите внимание, что все обратные вызовы и другое связанное поведение будут выполняться из этого вызова, поэтому будьте осторожны, откуда это вызывается.

Возвращает
Возвращает true, если были выполнены все ожидающие транзакции.

Ответ 2

Вы можете использовать MapView внутри вашего фрагмента (или действия), это позволит вам использовать любой макет, который вы хотите.

т.е. ваш макет может выглядеть следующим образом:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.gms.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

Вам также необходимо переместить методы жизненного цикла фрагмента, такие как onCreate, onResume и т.д. в MapView.

Единственная разница (кажется, ошибка в Картах Google?) заключается в том, что вам также необходимо вручную инициализировать Карты Google:

private void setUpMapIfNeeded() {
    if (mMap == null) {
        mMap = mMapView.getMap();
        if (mMap != null) {
            // Thought official docs says that it is not necessary to call
            // initialize() method if we got not-null GoogleMap instance from
            // getMap() method it seems to be wrong in case of MapView class.
            try {
                MapsInitializer.initialize(getActivity());
                setUpMap(mMap);
            } catch (GooglePlayServicesNotAvailableException impossible) {
                mMap = null;
            }
        }
    }
}