Android SupportMapFragment внутри фрагмента

Я пытаюсь использовать SupportMapFragment внутри фрагмента. При первом запуске карта отображается без ошибок.

Но когда я выполняю транзакцию к другому фрагменту, а после этого возвращаюсь к карте, у меня возникает ошибка надувания фрагмента. Но у меня нет никакой ошибки, когда я создаю новый экземпляр фрагмента, содержащего карту.

Вот мой макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    tools:context=".ui.HomeMapFragment">

    <fragment
        android:id="@+id/map"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/footer"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:name="com.google.android.gms.maps.SupportMapFragment" />

    <FrameLayout
        android:id="@+id/footer"
        android:layout_height="110dp"
        android:layout_width="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="@color/colorPrimary"/>

</RelativeLayout>

И я создаю экземпляр SupportMapFragment в onCreateView следующим образом:

 //Instantiate the map fragment
 mHolder.supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);

И я вызываю onMapReady в onActivityCreated:

if (mHolder.supportMapFragment != null)
     mHolder.supportMapFragment.getMapAsync(this);

Журнал ошибок :

    FATAL EXCEPTION: 
    main  Process: xxx.xxxx.xxxx, PID: 4441
android.view.InflateException: Binary XML file line #8: Error inflating class fragment 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
    at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(CalligraphyLayoutInflater.java:60) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
    at xxx.xxxx.xxxx.ui.HomeMapFragment.onCreateView(HomeMapFragment.java:234) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:971) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1670) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:586) 
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:189) 
    at com.xxx.xxx.ui.HomeActivity.onBackPressed(HomeActivity.java:71)

Я знаю, что нехорошо жестко кодировать фрагмент внутри макета фрагмента, но я уже пытался выполнить это с помощью frameLayout, но получаю еще много ошибок.


person Sofiane Hassaini    schedule 14.04.2016    source источник


Ответы (2)


Если вы хотите иметь карту во фрагменте, вам нужно использовать MapView вместо SupportMapFragment Как использовать MapView в Android с помощью Google Map V2?

person V.Sch    schedule 14.04.2016
comment
Не обязательно иметь MapView. См. рабочий ответ на странице stackoverflow.com/a/42160946/3496570. - person AndroidGeek; 10.02.2017
comment
неудовлетворенный ответ. См. комментарий @Nepster. - person Rahul Sharma; 01.09.2017
comment
Ответ @Nepster не работает идеально. Например, он воссоздает SupportMapFragment каждый раз, когда фрагмент скрывается и снова отображается. Этот недостаток отсутствует в случае MapView - person soshial; 29.05.2018

Работы в 2017 году (Котлин):

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val mapFragment = childFragmentManager.findFragmentById((R.id.map)) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }
person Andrii Kovalchuk    schedule 30.12.2017
comment
Я импортировал ссылку на фрагмент карты непосредственно перед вызовом getMapAsync(), но это вызвало сбой во время выполнения (приведение его к FrameLayout?). Единственное, что сработало для меня, было решением выше, используя childFragmentManager для поиска фрагмента. - person jhauberg; 10.01.2018