web-dev-qa-db-fra.com

Comment changer la position du bouton Ma position dans Google Maps avec Android studio

Je travaille sur Google Maps et je dois modifier la position de Ma position (bouton de position actuelle). Le bouton d'emplacement actuel est en haut à droite. Alors, aidez-moi à repositionner le bouton d'emplacement actuel sur l'écran de Google Maps. Merci d'avance.

mon exemple de code:

final GoogleMap googleMap = mMapView.getMap();
googleMap.setMyLocationEnabled(true);
13
user5710756

tu peux utiliser ça

View locationButton = ((View) mMapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
rlp.setMargins(0, 180, 180, 0);
11
Yashwanth Masetty

J'ai résolu ce problème dans mon fragment de carte en repositionnant le bouton d'emplacement dans le coin inférieur droit de la vue à l'aide du code ci-dessous. Voici mon MapsActivity.Java: -

import Android.support.v4.app.FragmentActivity;
import Android.os.Bundle;
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.GoogleMap;
import com.google.Android.gms.maps.OnMapReadyCallback;
import com.google.Android.gms.maps.SupportMapFragment;
import com.google.Android.gms.maps.model.LatLng;
import com.google.Android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    View mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_map);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapView = mapFragment.getView();
        mapFragment.getMapAsync(this);
            }

    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @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);
        }

    }
}

Et voici la disposition du fragment: -

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="com.infogird.www.location_button_reposition.MapFragment">

    <fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:map="http://schemas.Android.com/apk/res-auto"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:id="@+id/map"
        Android:name="com.google.Android.gms.maps.SupportMapFragment"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        />
</FrameLayout>

J'espère que cela résoudra votre problème. Merci.

17
Priya Jagtap

Vous pouvez utiliser le code ci-dessous pour toutes les conditions telles que: bouton d'emplacement en bas à gauche

1.Si vous voulez afficher le bouton d'emplacement en haut à droite

View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
            RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
            // position on right bottom
            rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
            rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);

2.Si vous voulez afficher le bouton d'emplacement en bas à droite

 View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
            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);

3.Si vous voulez afficher le bouton d'emplacement en bas à gauche

 View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
            RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
            // position on right bottom


            rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
            rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
            rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
            rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);

             rlp.addRule(RelativeLayout.ALIGN_PARENT_END, 0);
            rlp.addRule(RelativeLayout.ALIGN_END, 0);
            rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
            rlp.setMargins(30, 0, 0, 40);

Bonne chance

5
Adam

Version Kotlin de la réponse acceptée (pour en bas à droite) (car la conversion automatique échoue avec ce code)

 val locationButton= (mapView.findViewById<View>(Integer.parseInt("1")).parent as View).findViewById<View>(Integer.parseInt("2"))
 val rlp=locationButton.layoutParams as (RelativeLayout.LayoutParams)
 // 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);
4
dkzm

En définissant le remplissage sur GoogleMap Fragment, vous pouvez modifier la position de myLocationButton mais le seul problème est que cela modifiera également la position des autres boutons, comme le zoom.

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

@Override
public void onMapReady(GoogleMap map) {  
    map.setPadding(left, top, right, bottom);
}
2
Gaurav

Son travail affiche le bouton Mon emplacement en bas à droite de MapView.

XML

<com.google.Android.gms.maps.MapView
    Android:id="@+id/mapView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

Java

private MapView mMapView;

mMapView = (MapView) findViewById(R.id.mapView);

mMapView.getMapAsync(new OnMapReadyCallback() {
    @Override
    public void onMapReady(final GoogleMap mMap) {
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            mMap.setMyLocationEnabled(true);
        }

        if (mMapView != null && mMapView.findViewById(Integer.parseInt("1")) != null) {
            View locationButton = ((View) mMapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
            RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
            layoutParams.setMargins(0, 0, 20, 20);
        }
    }
});
1
Renish Patel

Vous pouvez faire une chose. Vous désactivez le bouton par défaut "Ma position" et créez un bouton personnalisé à la position de votre choix. En cliquant sur ce bouton, vous déplacez la caméra vers la latitude actuelle.

0
Megha Maniar

Malheureusement, vous ne pouvez définir que le rembourrage, comme suit:

@Override
public void onMapReady(GoogleMap googleMap) {
   googleMap.setPadding(left, top, right, bottom);
   ...
}

J'ai fini par créer le mien et l'intégrer dans une structure de cadre en utilisant layout_gravity pour spécifier où je le veux, dans ce cas, bottom/end:

<FrameLayout
   Android:layout_width="match_parent"
   Android:layout_height="300dp">

   <fragment
       Android:id="@+id/map"
       Android:name="com.google.Android.gms.maps.SupportMapFragment"
       Android:layout_width="match_parent"
       Android:layout_height="match_parent"
       .../>


     <ImageView
       Android:id="@+id/myLocationCustomButton"
       Android:layout_width="@dimen/custom_my_location_button_size"
       Android:layout_height="@dimen/custom_my_location_button_size"
       Android:layout_gravity="bottom|end"
       Android:background="@drawable/disc"
       Android:backgroundTint="@Android:color/white"
       Android:padding="@dimen/margin_smallest"
       Android:src="@drawable/ic_my_location"
       ../>
</FrameLayout>

Ensuite, dans l'activité, j'ai initialisé et démarré un client Google Api que je peux utiliser pour extraire l'emplacement actuel lorsque le bouton le nécessite, cliquez sur l'écouteur de clic de bouton ci-dessous:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    if (googleApiClient == null) {
        googleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    myLocationButton = rootView.findViewById(R.id.myLocationCustomButton);
}

@Override
protected void onStart() {
    googleApiClient.connect();
    super.onStart();
}

@Override
protected void onStop() {
    googleApiClient.disconnect();
    super.onStop();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    myLocationButton.performClick();
}

@Override
public void onConnectionSuspended(int i) {
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}

@Override
public void onMapReady(final GoogleMap googleMap) {
    this.googleMap = googleMap;

    myLocationButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
            CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 16);
            MainActivity.this.googleMap.animateCamera(cameraUpdate, 250, null);
        }
    });

Le build.gradle de mon sous-module d'application comporte également:

ext {
    playServicesVersion = "8.4.0"
}

dependencies {
   ...     
   compile "com.google.Android.gms:play-services-location:${playServicesVersion}"
   ...
}

J'espère que cela pourra aider.

0
Flavius Popescu

Je sais qu'il a été répondu et accepté mais ces réponses ne m'ont pas fonctionné. Peut-être y a-t-il eu des changements dans RelativeLayout.LayoutParams ou même dans GoogleMaps depuis sa réponse.

Dans mes tentatives avec les réponses existantes, je me suis rendu compte qu'il pourrait y avoir plus de règles LayoutParam pour le bouton Compas qui annulaient mes tentatives de déplacer le bouton Compas où je le voulais. J'ai expérimenté en supprimant plusieurs paramètres comme ceci:

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
                locationButton.getLayoutParams();

layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_START);
layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_END);

Et ensuite, en ajoutant les nouvelles règles comme dans plusieurs réponses. Mais cela n'a toujours pas fonctionné comme prévu. Plus souvent qu'autrement, le bouton restait quelque part sur le côté gauche.

J'ai décidé de simplement créer de nouveaux LayoutParams et de remplacer ceux qui existaient et ... cela fonctionnait parfaitement!

A l'origine, j'avais utilisé la balise view pour GoogleMapCompass, mais la question portait sur GoogleMapMyLocationButton. J'ai donc commenté la ligne GoogleMapCompass et l'ajoutée à la ligne GoogleMapMyLocationButton.

Voici le code pour MapFragment.Java:

import Android.app.Fragment;
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.GoogleMap;
import com.google.Android.gms.maps.OnMapReadyCallback;
import com.google.Android.gms.maps.SupportMapFragment;


public class MapFragment extends Fragment implements OnMapReadyCallback {
    private static final String TAG = MapFragment.class.getSimpleName();

    private SupportMapFragment mapFragment = null;

    public MapFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_map, container, false);

        Log.d(TAG, "onCreateView()");

        mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        mapFragment.setRetainInstance(true);

        mapFragment.getMapAsync(this);

        return view.findViewById(R.id.map);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        Log.d(TAG, "onMapReady()");

        View mapView = mapFragment.getView();

        moveCompassButton(mapView);
    }

    /**
     * Move the compass button to the right side, centered vertically.
     */
    public void moveCompassButton(View mapView) {
        try {
            assert mapView != null; // skip this if the mapView has not been set yet

            Log.d(TAG, "moveCompassButton()");

            // View view = mapView.findViewWithTag("GoogleMapCompass");
            View view = mapView.findViewWithTag("GoogleMapMyLocationButton");

            // move the compass button to the right side, centered
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
            layoutParams.addRule(RelativeLayout.CENTER_VERTICAL);
            layoutParams.setMarginEnd(18);

            view.setLayoutParams(layoutParams);
        } catch (Exception ex) {
            Log.e(TAG, "moveCompassButton() - failed: " + ex.getLocalizedMessage());
            ex.printStackTrace();
        }
    }
}
0
ByteSlinger