2016-04-14 1 views
5

J'essaie d'utiliser SupportMapFragment à l'intérieur d'un fragment. Lors du premier lancement, la carte est affichée sans erreur.Android SupportMapFragment à l'intérieur du fragment

Mais lorsque j'effectue une transaction vers un autre fragment, et après ce retour sur la carte, j'ai un fragment de gonflement d'erreur. Mais je n'ai aucune erreur quand je fais une nouvelle instance du fragment qui contient la carte.

Voici ma mise en page:

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

Et j'instancier mon SupportMapFragment dans onCreateView comme ceci:

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

Et j'appelle onMapReady à onActivityCreated:

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

journal d'erreur:

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) 

Je sais que ce n'est pas une bonne chose à coder en dur un fragment dans la mise en page d'un fragment, mais je l'ai déjà essayé d'effectuer cela en utilisant un frameLayout mais je reçois beaucoup d'autres erreurs

+0

erreur post Bûches trop –

+0

j'ai édité mon post –

Répondre

3

Si vous voulez avoir la carte dans le fragment, vous devez utiliser MapView au lieu de SupportMapFragment How to use MapView in android using google map V2?

+0

Th merci! Cela résout mon bug :) –

+0

De rien) –

+1

MapView n'est pas obligatoire. Voir la réponse de travail à http://stackoverflow.com/a/42160946/3496570 – Nepster

2

Travaux en 2017 (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

Super, je vais le tester, merci! –

+0

J'importais la référence au fragment de carte directement avant d'appeler 'getMapAsync()', mais cela a causé un plantage au moment de l'exécution (en le transformant en FrameLayout?). La seule chose qui fonctionnait pour moi était au dessus de la solution, en utilisant 'childFragmentManager' pour trouver le fragment. – jhauberg