Was ist der beste Weg, um ein Fragment mit einer MapView zu erstellen, nachdem das endgültige SDK mit Google Apis veröffentlicht wurde? MapView benötigt eine MapActivity, um richtig zu funktionieren.
Es funktioniert nicht, wenn die Aktivität, die die Fragmente verwaltet, von MapActivity erbt (schlechte Lösung, da dies gegen die Idee verstößt, dass Fragmente in sich geschlossen sind) und ein reguläres XML-basiertes Layout verwendet. Ich erhalte eine NullPointerException in MapActivity.setupMapView ():
E / AndroidRuntime (597): Auslöser: java.lang.NullPointerException E / AndroidRuntime (597): unter com.google.android.maps.MapActivity.setupMapView (MapActivity.java:400) E / AndroidRuntime (597): unter com.google.android.maps.MapView. (MapView.java:289) E / AndroidRuntime (597): unter com.google.android.maps.MapView. (MapView.java:264) E / AndroidRuntime (597): unter com.google.android.maps.MapView. (MapView.java:247)
Meine zweite Idee war, MapView programmgesteuert zu erstellen und die zugehörige Aktivität (über getActivity ()) als Kontext an den MapView-Konstruktor zu übergeben. Funktioniert nicht:
E / AndroidRuntime (834): Auslöser: java.lang.IllegalArgumentException: MapViews können nur in Instanzen von MapActivity erstellt werden. E / AndroidRuntime (834): unter com.google.android.maps.MapView. (MapView.java:291) E / AndroidRuntime (834): unter com.google.android.maps.MapView. (MapView.java:235) E / AndroidRuntime (834): at de.foo.FinderMapFragment.onCreateView (FinderMapFragment.java:225) E / AndroidRuntime (834): at android.app.FragmentManagerImpl.moveToState (FragmentManager.java:708) E / AndroidRuntime (834): at android.app.FragmentManagerImpl.moveToState (FragmentManager.java:900) E / AndroidRuntime (834): at android.app.FragmentManagerImpl.addFragment (FragmentManager.java:978) E / AndroidRuntime (834): at android.app.Activity.onCreateView (Activity.java:4090) E / AndroidRuntime (834): at android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:664)
Eigentlich sollte es so etwas wie MapFragment geben, das sich um die Hintergrundthreads kümmert, die MapView benötigt, denke ich ... Also, was ist die aktuelle Best Practice, um dies zu tun?
Danke und Grüße aus Deutschland, Valentin
Antworten:
Ab dem 03.12.2012 hat Google die Google Maps Android API v2 veröffentlicht . Jetzt können Sie diese Probleme vergessen. https://developers.google.com/maps/documentation/android/
Beispiel für die Verwendung einer neuen API - https://developers.google.com/maps/documentation/android/start#add_a_map
Diese API funktioniert mindestens für Android API 8, verwenden Sie sie also;).
Jetzt können Sie einfach die Fragmentklasse "com.google.android.gms.maps.MapFragment" verwenden. Die Karte wird in Ihrer Aktivität angezeigt. Layoutbeispiel über den obigen Link:
quelle
Ich habe es geschafft, dieses Problem mithilfe von TabHost in Fragmenten zu beheben.
Hier ist die Idee (kurz):
MainFragmentActivity
erweitertFragmentActivity
(aus Support-Bibliothek) und hatMapFragment
.MyMapActivity
erweitertMapActivity
und enthältMapView
.LocalActivityManagerFragment
GastgeberLocalActivityManager
MapFragment
erstreckt sichLocalActivityManagerFragment
.Und
LocalActivityManager
enthältMyMapActivity
Aktivität darin.Beispielimplementierung: https://github.com/inazaruk/map-fragment .
quelle
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
ist veraltet, aber dies ist nur ein Hack, dieses Problem soll richtig gelöst werden, wenn sie beschließen, die entsprechende Unterstützung für Karten in Fragmente aufzunehmen.Wie bei Google Groups erläutert , hat Peter Doyle eine benutzerdefinierte Kompatibilitätsbibliothek erstellt, die auch Google Maps unterstützt. android-support-v4-googlemaps
Es gibt jedoch auch einen Nachteil:
quelle
Nur um die Antwort zu klären. Ich habe den von inazaruk und ChristophK vorgeschlagenen Ansatz ausprobiert. Tatsächlich können Sie jede Aktivität in einem Fragment ausführen - nicht nur Google Maps. Hier ist der Code, der dank inazaruk und ChristophK die Google Map-Aktivität als Fragment implementiert.
quelle
LocalActivityManager
(wie hier erläutert : code.google.com/p/android/issues/detail?id=15347 ), besteht darin, alle zu erweiternFragmentActivities
, was noch weniger optimal erscheint.Tolle Neuigkeiten von Google dazu. Sie veröffentlichen heute eine neue Google Maps-API mit Indoor-Karten und MapFragment.
quelle
Die Google Maps-API ist nicht Teil des AOSP. Solange kein Googler antwortet, ist es kaum möglich zu sagen, ob es in Zukunft ein MapFragment geben wird.
Eine mögliche eingeschränkte Alternative besteht darin, a zu verwenden
WebViewFragment
und es zu missbrauchen, um eine benutzerdefiniertemaps.google.com
URL zu laden .quelle
Schade, dass Google noch nicht geantwortet hat. FWIW, wenn Sie dies wirklich tun müssen, habe ich keinen anderen Weg gefunden als:
Lassen Sie die Registerkarte "Aktivität verwalten" von MapActivity erben, erstellen Sie die MapView dort programmgesteuert, lassen Sie die mapfragment.xml eine ViewGroup enthalten und fügen Sie die MapView der ViewGroup hinzu
Dies widerspricht eindeutig der Vorstellung, dass Fragmente in sich geschlossen sein sollen, aber ...
quelle
Hier ist eine MonoDroid- Version ( Mono für Android ) eines sehr vereinfachten MapFragments :
quelle
Dies löst mein Problem beim Hinzufügen von MapView in Fragmenten. https://github.com/petedoyle/android-support-v4-googlemaps
quelle
Mit der neuen Version von ABS 4.0 gibt es keine Unterstützung für MapFragmentActivity. Hier ist eine gute Lösung für eine Kartenansicht in einem Fragment!
https://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/#comment-21
quelle
Darf ich die Lösung bekommen:
quelle
Ich habe eine kleine Bibliothek geschrieben, in der die LocalActivityManager-basierten Lösungen für das MapFragment-Problem zusammengefasst sind (enthält auch eine Beispiel-App mit verschiedenen Verwendungssituationen):
https://github.com/coreform/android-tandemactivities
quelle