0

Ich entwickle derzeit eine Android-App mit Xamarin.Android. In dieser App verwende ich ein DrawerLayout (aus der Support-Bibliothek v4), um meinen App-Inhalt und ein Menü anzuzeigen, das ich durch Drücken einer Schaltfläche in der Symbolleiste oder durch Verschieben nach rechts öffnen kann.MapFragment extrem langsam und kaum reagieren

Im ersten Teil der Schublade (Seiteninhalt) habe ich eine Symbolleiste, die die klassische Aktionsleiste, eine Suchleiste und mein MapFragment ersetzt.

Im Menüteil habe ich einen Scrollview mit einem linearen Layout, das einige Elemente wie Schaltflächen, Textansichten usw. enthält, die der Benutzer zum Verbinden oder Registrieren verwendet.

Das Menü gleitet reibungslos, jedes Element reagiert richtig, aber das Mapfragment ist wirklich in Schwierigkeiten, die Karte zu zeigen. Für einige Sekunden zeigt es ein leeres Gitter an, und ich muss auf das Fragment tippen, damit einige Teile der Karte geladen werden können. Fast keine Steuerelemente reagieren, manchmal funktioniert ein Doppeltippen nach langem Warten und es wird ewig dauern, genauere Kacheln zu laden.

Es gibt offensichtlich etwas, das meine Karte nicht korrekt lädt, aber ich habe keine Ahnung, was es ist. Hier

ist das Fragment der Karte:

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/mapFragment" 
      android:layout_marginTop="94dp" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      class="com.google.android.gms.maps.MapFragment" /> 

Und hier ist, wie ich meine Karte in der Aktivitätsdatei laden (in der OnCreate-Funktion):

MapFragment mapFrag = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.mapFragment); 
GoogleMap map = mapFrag.Map; 
if(map != null) 
{ 
    // The GoogleMap object is ready to go (well, should be) 
} 

Ich folgte meiner Karte erstellen Fragment: https://developer.xamarin.com/guides/android/platform_features/maps_and_location/maps/part_2_-_maps_api/

Ich kann bei Bedarf weitere Informationen zur Verfügung stellen. Ich habe keine Ahnung, woher das kommt. Ich benutzte den exakt gleichen Code in einer Test-App (außer es war in einem einfachen linearen Layout, keine Schublade und auch kein Rand) und es funktioniert perfekt, deshalb bin ich verwirrt.

Bearbeiten: Lassen Sie den Emulator und mein Handy die App laufen, während ich schrieb (dauerte mindestens fünf Minuten) und es immer noch nicht richtig reagiert. Getestet auf Genymotion Emulator (API 16) und auf meinem OnePlus One (API 21), dasselbe Ergebnis.

Vielen Dank im Voraus.

+0

Sind Sie sicher, dass die Karte geladen ist, was den Auflege verursacht? – zgc7009

+2

Haben Sie Probleme mit dem Netzwerk? Vorausgesetzt, Ihre App erstellt kein Blockierungsproblem, würde ich Ihre Netzwerkaktivitäten (über Charles, WireShark, etc ...) überprüfen, um die Reaktionszeiten von Google CDN zu überprüfen. Ist Google Maps App auf deinem Smartphone und Genymotion in Ordnung? – SushiHangover

+0

Ja, ich bin sicher, dass die Karte die Ursache war, denn während die Karte Probleme beim Laden hatte, funktionierte alles andere perfekt in der App. @SushiHangover das dachte ich irgendwann, also habe ich mein Netzwerk überprüft, das scheint gut zu funktionieren. Wifi-Netzwerk mit korrekter Konfiguration von Glasfaser für den Emulator und LTE mit meinem Handy. Ich habe es überprüft, indem ich die Beispiel-App gestartet habe, die Sie mit dem von mir bereitgestellten Xamarin-Link erstellen können, und die Karte wurde geladen und reagierte reibungslos. Das Problem lag offensichtlich in meinem Code, aber ich fand eine Wunderlösung: SupportMapFragment anstelle von MapFragment. – YumeYume

Antwort

1

Ich bin mir nicht sicher warum genau es "langsam" ist, es muss die Karte verarbeiten und laden.

Wenn Sie das Schubladenlayout verwenden, bedeutet dies, dass jede Seite höchstwahrscheinlich bereits ein Fragment ist. Dies bedeutet, dass Sie ein Fragment in einem Fragment haben werden. Als ich dies für die MyDriving-Beispielfunktionen bei Build implementierte, verwendete ich ein Standard-Widget MapView innerhalb des Fragments, und wenn ich in einer Aktivität war, verwendete ich die MapFragment.

das MapView Widget Wenn verwenden Sie IOnMapReadyCallback in Ihrem Fragment implementieren sollten Zugang zu erhalten:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     base.OnCreateView(inflater, container, savedInstanceState); 
     HasOptionsMenu = true; 
     var view = inflater.Inflate(Resource.Layout.fragment_current_trip, null); 

     mapView = view.FindViewById<MapView>(Resource.Id.map); 
     mapView.OnCreate(savedInstanceState); 
     return view; 
    } 

    public override void OnActivityCreated(Bundle savedInstanceState) 
    { 
     mapView.GetMapAsync(this); 
     base.OnActivityCreated(savedInstanceState); 
    } 

    GoogleMap map; 
    MapView mapView; 


    public void OnMapReady(GoogleMap googleMap) 
    { 
     map = googleMap; 
    } 

Es sollte beachtet werden, wenn Sie das MapView-Widget verwenden Sie auch, nachdem es aufzuräumen müssen:

#region MapView Lifecycle Events 

    public override void OnResume() 
    { 
     base.OnResume(); 
     mapView?.OnResume(); 
    } 

    public override void OnPause() 
    { 
     base.OnPause(); 
     mapView?.OnPause(); 
    } 

    public override void OnDestroy() 
    { 
     base.OnDestroy(); 
     mapView?.OnDestroy(); 
    } 

    public override void OnSaveInstanceState(Bundle outState) 
    { 
     base.OnSaveInstanceState(outState); 
     mapView?.OnSaveInstanceState(outState); 
    } 

    public override void OnLowMemory() 
    { 
     base.OnLowMemory(); 
     mapView?.OnLowMemory(); 
    } 

    #endregion 

Wenn Sie in einer Aktivität sind und mit Hilfe der MapFragment dann sollten Sie auch diesen gleichen Stil verwenden, obwohl es nicht notwendig ist, die Ereignisse wie die MapView Steuerung einzustellen:

Ich hoffe, das hilft

+0

Ich habe zuerst versucht, Ihren MapView-Vorschlag zu verwenden, und hatte Schwierigkeiten bei der Implementierung. Also habe ich mich entschieden, es erneut mit einem Fragment zu überprüfen, aber ich habe bemerkt, dass Sie ein SupportMapFragment und kein MapFragment verwendet haben. Also habe ich meinen Code angepasst und es funktioniert perfekt! Also, für jeden Benutzer, der Probleme mit einem Laggy-Map-Fragment haben könnte: SupportMapFragment ist die Wunderlösung! Danke vielmals ! – YumeYume