Map bei start über eigener Position zentrieren

  • 14 Antworten
  • Letztes Antwortdatum
B

Binbose

Ambitioniertes Mitglied
0
Hallo Leute,

wie der Titel schon sagt. möchte ich die Map über meiner eigenen Position zentrieren.
Aber irgendwie funktioniert es mit meinem Code nicht, vlt. könnt ihr ja mal rüber gucken, danke.

Code:
mMapView = (MapView)listenEintrag.findViewById(R.id.mv_karteAnzeigen);
                  mMapView.onCreate(savedInstanceState);

                  
                  
                  try {
                      initMapView();
                      onResume();
                } catch (GooglePlayServicesNotAvailableException e) {
                      e.printStackTrace();
                }
                  LatLng ll= new LatLng(myLocation.getLatitude(), myLocation.getLongitude());
                  map.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, 20));

Code:
private void initMapView() throws GooglePlayServicesNotAvailableException{
                boolean usePlayService = isGooglePlayServiceAvailable();
                if(usePlayService){
                    MapsInitializer.initialize(getApplicationContext());
                    
                    if(map == null){
                        map = mMapView.getMap();
                        if(map != null){
                            map.getUiSettings().setZoomControlsEnabled(true);
                            map.getUiSettings().setCompassEnabled(true);
                            map.setMyLocationEnabled(true);
                            map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                            map.animateCamera(CameraUpdateFactory.zoomTo(17.5f));
                            
                        }    
                    }
                }else {
                    ((Activity) getApplicationContext()).finish();
                }
            }
            private boolean isGooglePlayServiceAvailable(){
                int errorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
                if(errorCode != ConnectionResult.SUCCESS){
                    Dialog errorDialog = GooglePlayServicesUtil.getErrorDialog(errorCode, (Activity) getApplicationContext(), -1);
                    if(errorDialog != null){
                        errorDialog.show();
                        return false;
                    }
                }
                return true;
            }
            
            public void onResume(){
                if(mMapView != null){
                    mMapView.onResume();
                }
            }
PS: Die Map befindet sich in einer ListView

Und noch eine 2. Frage:

Der MyLocation Button oben rechts erscheint nicht, kennt jemand das Problem?
(Bei einer anderen Map in der App erscheint er nur beim ersten mal, sobald die Activity über einen Intent aufgerufen wird ist er auch nicht mehr da)
 
Zuletzt bearbeitet:
Nehme
gmap.moveCamera(CameraUpdateFactory.newLatLng(punkt));
statt
map.animateCamera(CameraUpdateFactory.zoomTo(17.5f ));

Mit Gruß
E.S.
 
Schon versucht, funktioniert nicht -.-

Der ursprüngliche Beitrag von 21:38 Uhr wurde um 21:59 Uhr ergänzt:

Achso, das ganze ist wie gesagt in einer ListView, und ich habe es jetzt einfach mal in die getView Methode gehauen
 
Was ist "myLocation"? Bzw. wo wird myLocation befüllt? Was ist myLocation zum Zeitpunkt wenn du die Map initialisierst?
 
mylocation wird als Extra mit dem aufrufenden Intent übergeben, da getMyLocation() in der onCreate nicht funktioniert (ich vermute weil die Map dort noch geladen bzw. die Verbindung zu den Google Servern noch erstellt wird)

Es scheint aber wirklich daran zu liegen, dass die Map im ersten Eintrag einer ListView liegt, und deshalb wahrscheinlich nicht richtig alle Lebenszyklus Methoden durchläuft
Ob es das wirklcih ist, und wenn ja wie ich es beheben kann weiß ich allerdings auch nicht
Jemand eine Ahnung wie ich in der ListView alle Lebenszyklus Methoden richtig aufrufen kann ?
In den Activity Lebenszyklus Methoden get es nicht, da z.B. die MapView.onDestroy ja nicht in der onDestroy der Activity aufgerufen werden muss, sondern schon sobald die der Eintrag aus dem Bild gerollt wird
:confused2:
 
Warum ist die Map denn in einer Liste? Ich hatte mal eine Map in eine Scrollview gepackt und musste massiv rumbasteln bis das Scrollen brauchbar funktioniert. Ich denke nicht das diese Lösung wirklich optimal ist.
 
Ja, an die Aufgabe die Map scrollbar zu machen werde ich auch noch ran müssen, aber eins nach dem anderen^^

Weil die Map nicht alleine steht sondern mit anderen Views, so dass sie ziemlich viel vom Bildschirm einnehmen, wenn sie also nicht aus dem Bildschirm rausscrollbar ist sieht man kaum noch was von den anderen Listeneinträgen dadrunter
 
Deine zweite Frage ist doch ganz einfach...

Du setzt doch schon UI-Einstellungen mit

PHP:
map.getUiSettings().setZoomControlsEnabled(true); 

map.getUiSettings().setCompassEnabled(true);

Dann setz noch ein

PHP:
map.getUiSettings().setMyLocationButtonEnabled(true);

hinzu und fertig.




Der Ansatzpunkt, wie man zentriert wurde auch schon genannt (moveCamera bzw. animateCamera). Bzw hast ja schon versucht umzusetzen. Kann mir gut vorstellen, dass dein "myLocation" einfach noch 0.0 : 0.0 als Koordinaten zurück gibt, weil es eben noch keine gefunden hat. Mach doch vom Location-Listener in der onLocationChanged die moveCamera-Funktion rein und es sollte gut sein.




Mal eine Anmerkung am Rande: schonmal Ram-Verbrauch angeschaut? Nach meinen Erfahrungen schluckt GMaps gut Speicher, kann mir nicht vorstellen, dass es förderlich ist, wenn in der Liste gleich mehrere Instanzen zeitgleich dargstellt werden. Aber das nur als Gedanke, kann sien, dass das gut geht, aber ich würde mal an deiner Stelle einen Blick drauf werfen.
 
Code:
map.getUiSettings().setMyLocationButtonEnabled(true);

Hat leider nichts gebracht (komischerweise habe ich das an anderer Stelle auch nie benutzt und der Button ist trotzdem da^^)

ne, mylocation liefert etwas Ordentliches, das habe ich schon mit der logcat überprüft
Ich kann im programm einfach nicht auf die map zugreifen, bekomme aber auch keine Fehlermeldung

...kann mir nicht vorstellen, dass es förderlich ist, wenn in der Liste gleich mehrere Instanzen zeitgleich dargstellt werden

Ne, die Liste stellt nur eine Instanz der Map dar, das ganze befindet sich in einer if(position == 0) Abfrage, erst danach kommen die "normalen" listeneinträge
 
Okay, was dann noch seltsam aussieht ist, dass du einfach onResume selbst aufrufst in der onCreate-Funktion. Es gibt einen festgelegten Lifecycle, d.h. onResume wird doch sowieso noch aufgerufen.

onResume sollte dann in etwa/mindestens so aussehen, also mit super.onResume():

PHP:
@Override
    public void onResume() {
        mapView.onResume();

        super.onResume();
    }
 
Ja, das habe ich auch zuerst so probiert, aber dann lädt die Map garicht, da die onResume Methode nur einmal am anfang(und ich denke mal auch vor der getView()) Methode aufgerufen wird
 
Hmm, ich kenne mich zwar mit der Karte bzw. der Logik, die du dort implementiert, nicht aus, aber was meinst du, wenn du sagst, dass "mylocation" einen ordentlichen Wert erhält? Bist du dir sicher, dass dieser Wert, den du dort erhälst, auch für eine Positionsanzeige verwenden kannst? Oder sind ggf. noch Manipulationen notwendig, dass der Wert verwertet werden kann?
Für mich klingt das mit dem Intent ehrlich gesagt etwas seltsam.. Sicher, dass das so State of the Art ist, die Position (einmalig?) aus einer zurückliegenden Activity zu übermitteln?

Eine aktualisierte Anzeige (wo der Punkt auf der Straße mitläuft) wird wahrscheinlich auch über eine onChangedXY-Methode realisiert werden..

Dass getView() ohne weiteres Zutun onResume() aufruft, bezweifle ich stark...
 
Naja, mylocation wurde in einer activity davor ( die auch eine map enthält) via map.getMyLocation() ermittelt
Ich habe mylocation wie gesagt auch in der logcat ausgeben lassen und die werte manuell in einer testmap eingesetzt und da hats funktioniert
Ich bin jetzt trotzdem mal hierauf umgestiegen:
Code:
LocationManager lmanager =  (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                    Location myLocation = lmanager.getLastKnownLocation(lmanager.getBestProvider(new Criteria(), true));
                    if(myLocation != null){
                        map.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(myLocation.getLatitude(), myLocation.getLongitude())));
                        map.animateCamera(CameraUpdateFactory.zoomTo(13.5f));
                    }

An dem Hauptproblem ( dass ich die Map im Programm nicht beeinflussen kann, was wie ich vermute mit den Lifecycle Methoden zusammenhängt, änder das leider nichts-.-)
 
Okay, und wo steht der Code jetzt?
Vielleicht hilft die Methode requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)

Zu finden hier, im unteren Viertel der Seite...
 
In der getView() Methode.
Das ist aber nicht das Problem, egal welche LatLng ich benutze, die Map reagiert einfach nicht. Ansonsten würde ja auch ne Fehlermeldung kommen, tut es aber nicht, es passiert einfach garnichts^^
 

Ähnliche Themen

D
Antworten
5
Aufrufe
572
swa00
swa00
BerndFfm
Antworten
7
Aufrufe
1.222
swa00
swa00
K
Antworten
3
Aufrufe
975
mezzothunder
mezzothunder
Zurück
Oben Unten