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);
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);
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.
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
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);
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);
}
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);
}
}
});
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.
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.
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();
}
}
}