wake-up-neo.net

AutoComplete-Suchleiste in Google Maps

Ich erstelle eine App, die auf der Ortssuche basiert. Ich würde gerne wissen, wie ich meiner Google Map eine Suchleiste hinzufügen kann, in der der Nutzer einen Ort auswählen kann und ich erfassen kann, was der Nutzer gewählt hat.

Ich versuche, ein Suchfeld mit automatischer Vervollständigung einzufügen, das über der Google Map in der Benutzeroberfläche angezeigt wird.

5
Enrique Alcacer

Sie können einfach ein PlaceAutoCompleteFragment verwenden.

Stellen Sie zunächst sicher, dass Sie die neueste Version der Google Play-Dienste verwenden ( ab Version 8.4.0 enthält die Klasse PlaceAutoCompleteFragment ):

compile 'com.google.Android.gms:play-services-maps:11.0.2'
compile 'com.google.Android.gms:play-services-location:11.0.2'
compile 'com.google.Android.gms:play-services-places:11.0.2'

Fügen Sie dann das PlaceAutoCompleteFragment in Ihr XML-Layout ein:

<LinearLayout 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=".MapsActivity"
    Android:orientation="vertical"
    Android:weightSum="1">

    <fragment
        Android:id="@+id/place_autocomplete"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:name="com.google.Android.gms.location.places.ui.PlaceAutocompleteFragment"
        />

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


</LinearLayout>

Richten Sie dann in Ihrer Aktivität einen Listener ein:

import com.google.Android.gms.common.api.Status;
import com.google.Android.gms.location.places.Place;
import com.google.Android.gms.location.places.ui.PlaceAutocompleteFragment;
import com.google.Android.gms.location.places.ui.PlaceSelectionListener;

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    PlaceAutocompleteFragment placeAutoComplete;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        placeAutoComplete = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete);
        placeAutoComplete.setOnPlaceSelectedListener(new PlaceSelectionListener() {
            @Override
            public void onPlaceSelected(Place place) {

                Log.d("Maps", "Place selected: " + place.getName());
            }

            @Override
            public void onError(Status status) {
                Log.d("Maps", "An error occurred: " + status);
            }
        });

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

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }
}

Wenn Sie diesen Code ausführen, wird die AutoComplete-Leiste über der Google Map angezeigt:

enter image description here

Wenn Sie auf die AutoComplete-Leiste klicken, sieht es folgendermaßen aus:

enter image description here

Beginnen Sie dann mit der Eingabe und wählen Sie einen Ort aus:

enter image description here

Wenn Sie auf einen Ort tippen, um ihn auszuwählen, wird das Protokoll vom PlaceSelectionListener angezeigt:

D/Maps: Place selected: San Francisco
15
Daniel Nugent

Ja, Sie können dies mit der make-Methode für addMarker tun, wenn Sie auf die Stelle drücken. Sie können diesen Code verwenden:

public class PlaceAutocompleteActivity extends AppCompatActivity implements OnMapReadyCallback {

private GoogleMap mMap;
PlaceAutocompleteFragment placeAutoComplete;

LatLng myLat;
Place placey;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_autocompleteplaces);

    getSupportActionBar().setTitle("Search about a Place");

    placeAutoComplete = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete);
    placeAutoComplete.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {

            addMarker(place);


        }

        @Override
        public void onError(Status status) {
            Log.d("Maps", "An error occurred: " + status);
        }
    });

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

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;


}

public void addMarker(Place p){

    MarkerOptions markerOptions = new MarkerOptions();

    markerOptions.position(p.getLatLng());
    markerOptions.title(p.getName()+"");
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure));

    mMap.addMarker(markerOptions);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(p.getLatLng()));
    mMap.animateCamera(CameraUpdateFactory.zoomTo(13));

}

}

1
Hamdan Hejazi