Ändern Sie die Position der Google Maps API-Schaltfläche "Mein Standort"

Ich benutze die Google Maps Android API v2, und ich brauche einen Weg zum Zufall die Position der Schaltfläche "Mein Standort".

Ich bekomme die Schaltfläche "Mein Standort" wie folgt:

  • Emulator-Problem nach neuem ADT-Update
  • Android fragment - findViewById gibt null zurück
  • Hyperlink in Android
  • Sollte eine interne DialogFragment-Klasse statisch sein oder nicht?
  • GreenDAO erstellt eine automatische ID-Eigenschaft
  • Synchronisierung von Daten zwischen Android App und Webserver
  • GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); final GoogleMap map = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); // This gets the button map.setMyLocationEnabled(true); 

  • Mehrere Aktivitäten, identisch onCreateOptionsMenu, onOptionsItemSelected und onKeyDown. Kann ich den Code irgendwie wiederverwenden?
  • Wie man eine Funktion in onclick Veranstaltung in xamarin.studio aufruft
  • Android - MapView in einer Listview enthalten
  • Java.lang.IllegalArgumentException: Ansicht nicht an Fenstermanager angeschlossen
  • Warum bekomme ich falsche requestCode?
  • Android-App-Updates und Datenbankänderungen
  • 14 Solutions collect form web for “Ändern Sie die Position der Google Maps API-Schaltfläche "Mein Standort"”

    Verwenden Sie einfach GoogleMap.setPadding (links, oben, rechts, unten), mit dem Sie Teile der Karte angeben können, die durch andere Ansichten verdeckt werden können. Das Einstellen der Polsterung stellt die Standardkartenkontrollen neu ein, und die Kameraaktualisierungen verwenden die gepolsterte Region.

    https://developers.google.com/maps/documentation/android/map#map_padding

    Sie können die Schaltfläche "Mein Standort" erhalten und verschieben, wie:

     public class MapFragment extends SupportMapFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View mapView = super.onCreateView(inflater, container, savedInstanceState); // Get the button view View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2); // and next place it, for exemple, on bottom right (as Google Maps app) RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams(); // position on right bottom rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); rlp.setMargins(0, 0, 30, 30); } } 

    Das ist vielleicht nicht die beste Lösung, aber du könntest deinen eigenen Knopf über die Karte legen und selbst behandeln. Es würde folgendes tun: –

    1) Setzen Sie die Karte in eine frameLayout und fügen Sie Ihre Schaltfläche oben. Z.B

     <FrameLayout android:id="@+id/mapFrame" android:layout_width="match_parent" android:layout_height="match_parent" > <fragment xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/mapFragment" android:layout_width="fill_parent" android:layout_height="fill_parent" class="com.google.android.gms.maps.MapFragment" map:mapType="normal" map:uiCompass="true" /> <ImageButton android:id="@+id/myMapLocationButton" android:layout_width="36dp" android:layout_height="36dp" android:layout_gravity="bottom|right" android:background="@drawable/myMapLocationDrawable" android:contentDescription="My Location" /> </FrameLayout> 

    2) Bearbeiten Sie die Karten-UI-Einstellungen, so dass die Schaltfläche nicht angezeigt wird, wenn Sie setMyLocationEnabled (true) aufrufen. Sie können dies über map.getUiSettings (). SetMyLocationButtonEnabled (false);

    3) Behandle den Klick deiner neuen Schaltfläche, um zu emulieren, was die mitgelieferte Taste tut. ZB rufen Sie mMap.setMyLocationEnabled (…); Und verschieben Sie die Karte an den aktuellen Standort.

    Hoffe, das hilft, oder hoffe jemand kommt lange mit einer einfacheren Lösung für dich 😉

    Es ist schon oben erklärt worden.Just eine kleine Ergänzung zu fabLouis Antwort. Sie können auch Ihre Kartenansicht aus dem SupportMapFragment erhalten.

      /** * Move the button */ SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager(). findFragmentById(R.id.map); View mapView = mapFragment.getView(); if (mapView != null && mapView.findViewById(1) != null) { // Get the button view View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2); // and next place it, on bottom right (as Google Maps app) RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) locationButton.getLayoutParams(); // position on right bottom layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); layoutParams.setMargins(0, 0, 30, 30); } 

    Siehe untenstehende Methode. Es lebt in einer Klasse, die SupportMapFragment erweitert. Es bekommt die Container-Ansicht für die Schaltfläche und zeigt sie an der Unterseite, horizontal zentriert.

     /** * Move my position button at the bottom of map */ private void resetMyPositionButton() { //deep paths for map controls ViewGroup v1 = (ViewGroup)this.getView(); ViewGroup v2 = (ViewGroup)v1.getChildAt(0); ViewGroup v3 = (ViewGroup)v2.getChildAt(0); ViewGroup v4 = (ViewGroup)v3.getChildAt(1); //my position button View position = (View)v4.getChildAt(0); int positionWidth = position.getLayoutParams().width; int positionHeight = position.getLayoutParams().height; //lay out position button RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight); int margin = positionWidth/5; positionParams.setMargins(0, 0, 0, margin); positionParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); positionParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); position.setLayoutParams(positionParams); } 

    Erstens erhalten Sie Google Map View:

      View mapView = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getView(); 

    Dann findest du die MyLocation-Schaltfläche (ID's von Android Studio Debugger):

      View btnMyLocation = ((View) mapView.findViewById(1).getParent()).findViewById(2); 

    Schließlich setzen Sie einfach neue RelativeLayout-Params für die MyLocation-Schaltfläche ein (richten Sie in diesem Fall vertrauensvoll über die Mitte des Zentrums aus):

     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(80,80); // size of button in dp params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); params.setMargins(0, 0, 20, 0); btnMyLocation.setLayoutParams(params); 

    Boom! Jetzt kannst du es bewegen, wie du willst;)

    Ich löste dieses Problem in meinem Kartenfragment, indem ich meinen Standortknopf an die rechte untere Ecke der Ansicht unter Verwendung des Codes unten positioniere, hier ist meine Maps Activity.java: –

    Fügen Sie diese Zeilen Code in onCreate () -Methode,

      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapView = mapFragment.getView(); mapFragment.getMapAsync(this); 

    Und hier ist onMapReady () Code: –

     @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setMyLocationEnabled(true); // Add a marker in Sydney and move the camera LatLng sydney = new LatLng(-34, 151); mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); if (mapView != null && mapView.findViewById(Integer.parseInt("1")) != null) { // Get the button view View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2")); // and next place it, on bottom right (as Google Maps app) RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) locationButton.getLayoutParams(); // position on right bottom layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); layoutParams.setMargins(0, 0, 30, 30); } } 

    Ich hoffe, das wird dein Problem lösen. Vielen Dank.

    Wenn du nur die Standortanzeige aktiviert haben möchtest (der blaue Punkt), brauche aber keine Standard-Schaltfläche "Mein Standort":

     mGoogleMap.setMyLocationEnabled(true); mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false); 

    Auf diese Weise kannst du auch deine eigene Schaltfläche zeichnen, wo du willst, ohne seltsame Sachen wie diese mapView.findViewById(1).getParent()) .

    Ich habe keine Lust, diese magischen Blick-IDs zu sehen, die andere benutzen, ich schlage vor, Tags zu verwenden, um MapView Kinder zu finden.

    Hier ist meine Lösung für die Platzierung der Schaltfläche " Mein Standort" über den Zoom- Steuerelementen.

     // Get map views View location_button =_mapView.findViewWithTag("GoogleMapMyLocationButton"); View zoom_in_button = _mapView.findViewWithTag("GoogleMapZoomInButton"); View zoom_layout = (View) zoom_in_button.getParent(); // adjust location button layout params above the zoom layout RelativeLayout.LayoutParams location_layout = (RelativeLayout.LayoutParams) location_button.getLayoutParams(); location_layout.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); location_layout.addRule(RelativeLayout.ABOVE, zoom_layout.getId()); 

    Ich hatte das gleiche Problem. Ich landete mit dem Hierarchie-Viewer, um die Ansicht zu identifizieren, die verwendet wurde, um die Schaltfläche anzuzeigen und sie zu manipulieren. Sehr hacky, ich weiß, konnte aber nicht anders aussehen

    Es war ein bisschen ein Kampf um diese Arbeit zu bekommen. Aber ich habe es getan, und in der Prozess auch begonnen, die Zoom-Tasten um zu bewegen. Hier mein vollständiger Code:

     package com.squirrel.hkairpollution; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.UiSettings; import com.google.android.gms.maps.model.LatLng; public class MySupportMapFragment extends SupportMapFragment { private static final String TAG = HKAirPollution.TAG; public MySupportMapFragment() { return; } @Override public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) { Log.v(TAG, "In overridden onCreateView."); View v = super.onCreateView(arg0, arg1, arg2); Log.v(TAG, "Initialising map."); initMap(); return v; } @Override public void onViewCreated (View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); resetButtons(); } private void initMap(){ UiSettings settings = getMap().getUiSettings(); settings.setAllGesturesEnabled(true); settings.setMyLocationButtonEnabled(true); LatLng latLong = new LatLng(22.320542, 114.185715); getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(latLong,11)); } /** * Move my position button at the bottom of map */ private void resetButtons() { // Get a reference to the zoom buttons and the position button. ViewGroup v1 = (ViewGroup)this.getView(); ViewGroup v2 = (ViewGroup)v1.getChildAt(0); ViewGroup v3 = (ViewGroup)v2.getChildAt(0); ViewGroup v4 = (ViewGroup)v3.getChildAt(1); // The My Position button View position = (View)v4.getChildAt(0); int positionWidth = position.getLayoutParams().width; int positionHeight = position.getLayoutParams().height; // Lay out the My Position button. RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight); int margin = positionWidth/5; positionParams.setMargins(0, 0, 0, margin); positionParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); positionParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); position.setLayoutParams(positionParams); // The Zoom buttons View zoom = (View)v4.getChildAt(2); int zoomWidth = zoom.getLayoutParams().width; int zoomHeight = zoom.getLayoutParams().height; // Lay out the Zoom buttons. RelativeLayout.LayoutParams zoomParams = new RelativeLayout.LayoutParams(zoomWidth, zoomHeight); zoomParams.setMargins(0, 0, 0, margin); zoomParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); zoomParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); zoom.setLayoutParams(zoomParams); } } 

    Ein Weg, um mit diesem Problem umzugehen. Löschen Sie die Standard-Schaltfläche und erstellen Sie Ihre eigenen. In der OnCreate-Anweisung füge das nächste hinzu:

     GoogleMap mMap = ((MapView) inflatedView.findViewById(R.id.mapview)).getMap(); LocationManager locationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); String provider = locationManager.getBestProvider(criteria, false); Location location = locationManager.getLastKnownLocation(provider); locationManager.requestLocationUpdates(provider, 2000, 1, this); mMap.setMyLocationEnabled(true); mMap.getUiSettings().setMyLocationButtonEnabled(false); // delete default button Imagebutton imgbtn = (ImageButton) view.findViewById(R.id.imgbutton); //your button imgbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 15)); } }); 

    Versuchen Sie diesen Code

     private void resetMyPositionButton() { Fragment fragment = ( (SupportMapFragment) getSupportFragmentManager().findFragmentById( R.id.map ) ); ViewGroup v1 = (ViewGroup) fragment.getView(); ViewGroup v2 = (ViewGroup)v1.getChildAt(0); ViewGroup v3 = (ViewGroup)v2.getChildAt(2); View position = (View)v3.getChildAt(0); int positionWidth = position.getLayoutParams().width; int positionHeight = position.getLayoutParams().height; //lay out position button RelativeLayout.LayoutParams positionParams = new RelativeLayout.LayoutParams(positionWidth,positionHeight); int margin = positionWidth/5; positionParams.setMargins(margin, 0, 0, margin); positionParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); positionParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); position.setLayoutParams(positionParams); } 

    Sie können folgende Vorgehensweise verwenden:

      View myLocationParent = ((View) getView().findViewById(1).getParent()); View myLocationParentParent = ((View) myLocationParent.getParent()); // my position button int positionWidth = myLocationParent.getLayoutParams().width; int positionHeight = myLocationParent.getLayoutParams().height; // lay out position button FrameLayout.LayoutParams positionParams = new FrameLayout.LayoutParams( positionWidth, positionHeight); positionParams.setMargins(0, 100, 0, 0); myLocationParent.setLayoutParams(positionParams); 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.