webentwicklung-frage-antwort-db.com.de

So ändern Sie die Position der Schaltfläche "Mein Standort" in Google Maps mit Android Studio

Ich arbeite an Google Maps und muss die Position von Mein Standort (Schaltfläche für aktuellen Standort) ändern. Die Schaltfläche für den aktuellen Standort befindet sich oben rechts. Helfen Sie mir also bitte, wie Sie die Schaltfläche für den aktuellen Standort auf dem Google Maps-Bildschirm neu positionieren. Danke im Voraus.

mein beispielcode:

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

sie können dies verwenden

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

Ich habe dieses Problem in meinem Kartenfragment gelöst, indem ich den Standort-Button in der rechten unteren Ecke der Ansicht mit dem folgenden Code positionierte. Hier ist mein 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);
        }

    }
}

Und hier ist das Layout des Fragments: -

<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>

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

17
Priya Jagtap

Sie können den folgenden Code für alle Bedingungen verwenden, z. B. für folgende Bedingungen: 1.Wenn Sie die Schaltfläche Standort oben rechts anzeigen möchten 2.Wenn Sie die Schaltfläche Standort unten rechts anzeigen möchten 3.Wenn Sie anzeigen möchten Positionstaste unten links

1.Wenn Sie die Ortsschaltfläche oben rechts anzeigen möchten

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.Wenn Sie die Schaltfläche Standort anzeigen unten rechts anzeigen möchten

 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.Wenn Sie die Schaltfläche Standort anzeigen unten links anzeigen möchten

 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);

Viel Glück

5
Adam

Kotlin-Version der akzeptierten Antwort (für rechts unten) (da die automatische Konvertierung mit diesem Code fehlschlägt)

 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

Wenn Sie die Auffüllung auf GoogleMap Fragment setzen, können Sie die Position von myLocationButton ändern. Das einzige Problem ist jedoch, dass auch die Position anderer Tasten geändert wird, z.

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

Ihre Arbeit zeigt die Schaltfläche Mein Standort unten rechts in MapView an

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

Kotlin-Version für MapFragment der akzeptierten Antwort

val locationButton = (mapFragment.view?.findViewById<View>(Integer.parseInt("1"))?.parent as View).findViewById<View>(Integer.parseInt("2"))
                    val rlp =  locationButton.getLayoutParams() as RelativeLayout.LayoutParams
                    rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0)
                    rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE)
                    rlp.setMargins(0, 0, 30, 30)
1
Yash Doshi

Fügen Sie diesen Code in der onCreate -Methode nach der mapFragment.getMapAsync(this) ein. Es wird Ihre My Location Taste unten rechts platzieren.

View locationButton = ((View) mapFragment.getView().findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
rlp.setMargins(0, 0, 30, 30);
1
Arafat

Sie können eine Sache tun. Sie deaktivieren die Standardschaltfläche "Mein Standort" und erstellen eine benutzerdefinierte Schaltfläche an der gewünschten Position. Durch Klicken auf diese Schaltfläche bewegen Sie die Kamera auf die aktuelle Länge.

0
Megha Maniar

Leider können Sie nur die Auffüllung wie folgt einstellen:

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

Am Ende habe ich meine eigene erstellt und in ein Frame-Layout eingebettet, indem ich layout_gravity verwendet habe, um anzugeben, wo ich es haben möchte, in diesem Fall 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>

Dann habe ich in der Aktivität einen Google-API-Client initialisiert und gestartet, mit dem ich den aktuellen Standort abrufen kann, wenn er während eines Klicks von der Schaltfläche benötigt wird.

@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);
        }
    });

Der build.gradle meines App-Submoduls hat auch:

ext {
    playServicesVersion = "8.4.0"
}

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

Hoffentlich hilft das.

0
Flavius Popescu

Ich weiß, dass es beantwortet und akzeptiert wurde, aber diese Antworten haben für mich nicht funktioniert. Möglicherweise hat sich das RelativeLayout.LayoutParams oder sogar GoogleMaps geändert, seit es beantwortet wurde.

Bei meinen Versuchen mit den vorhandenen Antworten wurde mir klar, dass es möglicherweise mehr LayoutParam-Regeln für die Kompass-Schaltfläche gibt, die meine Versuche überschreiben, die Kompass-Schaltfläche an die gewünschte Stelle zu verschieben. Ich experimentierte, indem ich einige Parameter wie folgt entfernte:

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);

Und dann die neuen Regeln hinzufügen, wie in einigen Antworten. Aber es funktionierte immer noch nicht wie erwartet. Meistens blieb der Knopf irgendwo auf der linken Seite.

Ich habe mich entschieden, einfach neue LayoutParams zu erstellen und die vorhandenen zu ersetzen, und ... es hat perfekt funktioniert!

Ich habe ursprünglich das View-Tag für GoogleMapCompass verwendet, aber die Frage betraf die GoogleMapMyLocationButton. Also habe ich die GoogleMapCompass-Zeile auskommentiert und die GoogleMapMyLocationButton-Zeile eingefügt.

Hier ist der Code für 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