2016-04-14 17 views
5

Próbuję użyć SupportMapFragment wewnątrz fragmentu. Przy pierwszym uruchomieniu mapa jest wyświetlana bez żadnego błędu.Android SupportMapFragment wewnątrz Fragment

Ale kiedy wykonuję transakcję na inny fragment, a po tym powrocie na mapę, pojawia się błąd polegający na nadymaniu fragmentu. Ale nie mam żadnego błędu, kiedy tworzę nowe wystąpienie fragmentu zawierającego mapę.

Oto mój plan:

<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> 

I instanciate mój SupportMapFragment w onCreateView tak:

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

i wzywam onMapReady w onActivityCreated: log

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

błędu:

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.tapptic.collecto.ui.HomeActivity.onBackPressed(HomeActivity.java:71) 

wiem, że to nie jest dobra rzecz ciężko kodem fragment wewnątrz układu fragmentu ale ja już próbował wykonać to za pomocą frameLayout ale dostaję wiele więcej błędów

+0

błąd po loguje zbyt –

+0

mam edytowane mój post –

Odpowiedz

3

Jeśli chcesz mieć mapę w fragment, trzeba użyć MapView zamiast SupportMapFragment How to use MapView in android using google map V2?

+0

Th ank ty! To rozwiązuje mój błąd :) –

+0

Nie ma za co) –

+1

Nie jest obowiązkowe posiadanie MapView. Zobacz działającą odpowiedź na http://stackoverflow.com/a/42160946/3496570 – Nepster

2

działa w 2017 roku (Kotlin)

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

     val mapFragment = childFragmentManager.findFragmentById((R.id.map)) as SupportMapFragment 
     mapFragment.getMapAsync(this) 
    } 
+0

Świetnie, przetestuję to, dzięki! –

+0

Zaimportowałem odwołanie do fragmentu mapy bezpośrednio przed wywołaniem 'getMapAsync()', ale to spowodowało awarię w czasie działania (przeniesienie jej do FrameLayout?). Jedyną rzeczą, która działała dla mnie była powyżej rozwiązania, przy użyciu 'childFragmentManager', aby znaleźć fragment. – jhauberg

Powiązane problemy