MapView dans un Fragment (Nid d'abeille)
maintenant que la version finale du SDK est avec google api - quelle est la meilleure façon de créer un Fragment avec une MapView? MapView besoin d'un MapActivity de travail de droit.
Ayant l'Activité la gestion de l'Fragments d'hériter de MapActivity (mauvaise solution car elle va à l'encontre de l'idée que les Fragments sont autonomes) et d'utiliser un xml de mise en page ne fonctionne pas. Je reçois un NullPointerException dans MapActivity.setupMapView():
E/AndroidRuntime( 597): Causée par: java.lang.NullPointerException E/AndroidRuntime( 597): au com.google.android.cartes.MapActivity.setupMapView(MapActivity.java:400) E/AndroidRuntime( 597): au com.google.android.cartes.MapView.(MapView.java:289) E/AndroidRuntime( 597): au com.google.android.cartes.MapView.(MapView.java:264) E/AndroidRuntime( 597): au com.google.android.cartes.MapView.(MapView.java:247)
Ma deuxième idée était de créer la MapView par programme et réussir l'activité qui y est associée (via getActivity()) dans le Contexte de la MapView constructeur. Ne fonctionne pas:
E/AndroidRuntime( 834): Causée par: java.lang.IllegalArgumentException: MapViews ne peut être créée à l'intérieur des instances de MapActivity. E/AndroidRuntime( 834): au com.google.android.cartes.MapView.(MapView.java:291) E/AndroidRuntime( 834): au com.google.android.cartes.MapView.(MapView.java:235) E/AndroidRuntime( 834): au de.foo.FinderMapFragment.onCreateView(FinderMapFragment.java:225) E/AndroidRuntime( 834): au android.app.FragmentManagerImpl.moveToState(FragmentManager.java:708) E/AndroidRuntime( 834): au android.app.FragmentManagerImpl.moveToState(FragmentManager.java:900) E/AndroidRuntime( 834): au android.app.FragmentManagerImpl.addFragment(FragmentManager.java:978) E/AndroidRuntime( 834): au android.app.De l'activité.onCreateView(l'Activité.java:4090) E/AndroidRuntime( 834): au android.vue.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
Vraiment il devrait y avoir quelque chose comme MapFragment qui prend soin de les threads d'arrière-plan MapView besoins, je suppose... Donc qu'est-ce que les meilleures pratiques en vigueur pour ce faire?
Merci et salutations de l'Allemagne,
Valentin
- Je l'ai signalé une demande de fonctionnalité pour cette. Veuillez étoile. code.google.com/p/android/issues/detail?id=15347
Vous devez vous connecter pour publier un commentaire.
De 03.12.2012 Google a publié Google Maps API Android v2. Maintenant, vous pouvez oublier ces problèmes.
https://developers.google.com/maps/documentation/android/
Exemple d'utilisation de la nouvelle API - https://developers.google.com/maps/documentation/android/start#add_a_map
Cette API va travailler pour au moins l'API Android 8, afin de l'utiliser ;).
Alors maintenant, vous pouvez simplement utiliser "com.google.android.gms.cartes.MapFragment" fragment de la classe. Il affiche la carte dans votre Activité. Exemple de disposition à partir du lien ci-dessus:
J'ai réussi à résoudre ce problème en utilisant TabHost dans le fragment.
Ici, c'est l'idée (brièvement):
MainFragmentActivity
s'étendFragmentActivity
(à partir de la bibliothèque de prise en charge) et aMapFragment
.MyMapActivity
s'étendMapActivity
et contiennentMapView
.LocalActivityManagerFragment
hôtesLocalActivityManager
MapFragment
s'étendLocalActivityManagerFragment
.Et
LocalActivityManager
contientMyMapActivity
l'activité en elle.Exemple de mise en œuvre: https://github.com/inazaruk/map-fragment.
Intent i = new Intent(getActivity().getParent(), MyMapActivity.class); Window w = localActivityManager.startActivity("tag", i); currentView=w.getDecorView(); currentView.setVisibility(View.VISIBLE); currentView.setFocusableInTouchMode(true); ((ViewGroup) currentView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); this.contentView.addView(currentView);
LocalActivityManager
est obsolète, mais c'est juste un hack, ce problème doit être résolu correctement lorsqu'ils décident d'inclure le soutien approprié pour les Cartes dans des Fragments.Tel que discuté à Google Groupes, Peter Doyle construit une coutume bibliothèque de compatibilité de l'appui de Google Maps trop. android-support-v4-googlemaps
Cependant, il ya un inconvénient trop:
Juste pour préciser la réponse. J'ai essayé l'approche suggérée par inazaruk et ChristophK. En fait, vous pouvez exécuter n'importe quelle activité dans un fragment - et pas seulement google maps. Voici le code qui implémente google map activité comme un fragment grâce à inazaruk et ChristophK.
LocalActivityManager
(comme expliqué ici: code.google.com/p/android/issues/detail?id=15347) implique l'extension des tousFragmentActivities
, qui semble encore moins optimale.Grandes nouvelles en provenance de Google sur ce. Ils publient aujourd'hui un nouvelle version de Google Maps API, avec des cartes de l'intérieur et MapFragment.
L'API Google Maps ne fait pas partie de l'AFST. Tant que pas de Googleurs répond qu'il est à peine possible de savoir si il y aura une MapFragment dans l'avenir.
Un possible limitée alternative est d'utiliser un
WebViewFragment
et les abus qui en à la charge personnaliséemaps.google.com
URL.Hm dommage que Google n'a pas encore répondu. FWIW, si vous avez vraiment besoin pour ce faire je n'ai pas trouvé d'autre moyen que d':
Ont l'Onglet Gestion de l'Activité hériter de MapActivity, créer la MapView dans il y la programmation, ont le mapfragment.xml contenir un ViewGroup et ajouter la MapView à la ViewGroup à l'aide de
Clairement cela va fortement contre l'idée que les fragments sont ment être autonomes, mais ...
Voici un MonoDroid (Mono pour Android) en version très simplifiée de MapFragment:
Cela résout mon problème en ajoutant MapView dans les Fragments.
https://github.com/petedoyle/android-support-v4-googlemaps
Avec la nouvelle version de l'ABS 4.0, il n'y a pas de soutien pour MapFragmentActivity, voici une bonne solution pour avoir une mapview dans un Fragment de!
https://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/#comment-21
Puis-je obtenir la solution:
J'ai écrit une petite bibliothèque, écrasant le LocalActivityManager de solutions basées sur la MapFragment problème (comprend également un exemple d'application montrant les différentes situations d'utilisation):
https://github.com/coreform/android-tandemactivities