J'utilise l'API Android Google Maps v2 et j'ai besoin d'un moyen de tenter la position du bouton "Ma position"
Je reçois le bouton "Ma position" comme ceci:
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
final GoogleMap map = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
// This gets the button
map.setMyLocationEnabled(true);
Utilisez simplement GoogleMap.setPadding (gauche, haut, droite, bas) pour indiquer les parties de la carte susceptibles d'être masquées par d'autres vues. Le réglage du remplissage repositionne les commandes de carte standard et les mises à jour de la caméra utilisent la région complétée.
https://developers.google.com/maps/documentation/Android/map#map_padding
Vous pouvez obtenir le bouton "Ma position" et le déplacer, comme suit:
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);
}
}
Ce n'est peut-être pas la meilleure solution, mais vous pouvez placer votre propre bouton sur la carte et le gérer vous-même. Il faudrait ce qui suit: -
1) Placez la carte dans un frameLayout et ajoutez votre bouton en haut. Par exemple.
<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) Modifiez les paramètres de l'interface utilisateur des cartes afin que le bouton n'apparaisse pas lorsque vous appelez setMyLocationEnabled (true). Vous pouvez le faire via map.getUiSettings (). setMyLocationButtonEnabled (false);
3) Gérez le clic de votre nouveau bouton pour émuler ce que fait le bouton fourni. Par exemple. appelez mMap.setMyLocationEnabled (...); et déplacez la carte vers l’emplacement actuel.
J'espère que cela vous aide ou espère que quelqu'un viendra longtemps avec une solution plus simple pour vous ;-)
Cela a déjà été expliqué ci-dessus. Juste un petit ajout à la réponse de fabLouis . Vous pouvez également obtenir votre vue cartographique à l'aide de SupportMapFragment.
/**
* 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);
}
Je n'ai pas envie de voir ces identifiants de vues magiques que d'autres utilisent, je suggère d'utiliser des balises pour trouver les enfants de MapView
.
Voici ma solution pour placer le bouton Ma position au-dessus des commandes Zoom .
// 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());
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 activité Maps.Java: -
ajouter ces lignes de code dans la méthode onCreate (),
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapView = mapFragment.getView();
mapFragment.getMapAsync(this);
et voici le code onMapReady (): -
@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);
}
}
J'espère que cela résoudra votre problème. Merci.
D'abord, obtenez Google Map View:
View mapView = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getView();
Ensuite, recherchez le bouton MyLocation (identifiant du débogueur Android Studio):
View btnMyLocation = ((View) mapView.findViewById(1).getParent()).findViewById(2);
Enfin, définissez simplement les nouveaux paramètres RelativeLayout pour le bouton MyLocation (alignez le parent droit + centre verticalement dans ce cas):
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! Maintenant tu peux le déplacer comme tu veux;)
Voir la méthode ci-dessous. Il vit dans une classe qui étend SupportMapFragment. Il obtient la vue conteneur pour le bouton et l'affiche en bas, centré horizontalement.
/**
* 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);
}
Si vous souhaitez simplement activer l’indication d’emplacement (le point bleu) mais n’avez pas besoin du bouton par défaut Mon emplacement:
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false);
De cette façon, vous pouvez aussi dessiner votre propre bouton là où vous le souhaitez sans trucs étranges comme ce mapView.findViewById(1).getParent())
.
J'ai eu le même problème. J'ai fini par utiliser le visualiseur de hiérarchie pour identifier la vue utilisée pour afficher le bouton et le manipuler. Très hacky, je sais, mais je ne pouvais pas trouver un moyen différent.
essayez ce 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);
}
Une façon de régler ce problème. Supprimez le bouton par défaut et créez votre propre . Dans l'instruction OnCreate, ajoutez le suivant:
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));
}
});
C'était un peu difficile de faire fonctionner cela. Mais je l'ai fait et dans le processus a également commencé à déplacer les boutons de zoom. Voici mon code complet:
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);
}
}
Vous pouvez utiliser l'approche suivante:
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);
Avant, vous pouviez supprimer l'ancienne règle de bouton:
@Override
public void onMapReady(final GoogleMap googleMap) {
this.map = googleMap;
// Show location button
View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
Log.l(Arrays.toString(rlp.getRules()), L.getLogInfo());
int[] ruleList = rlp.getRules();
for (int i = 0; i < ruleList.length; i ++) {
rlp.removeRule(i);
}
Log.l(Arrays.toString(rlp.getRules()), L.getLogInfo());
//Do what you want to move this location button:
rlp.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
}
J'ai ajouté une ligne à mon fragment Android: layout_marginTop = "? Attr/actionBarSize" Cela m'a aidé