場所の検索に基づいてアプリを作成しています。 Googleマップに検索バーを追加して、ユーザーが場所を選択し、ユーザーが選択したものをキャプチャする方法を知りたいのですが。
UIのGoogleマップの上に表示されるオートコンプリート検索ボックスを含めようとしています。
PlaceAutoCompleteFragment を使用するだけです。
まず、最新バージョンのGoogle Play開発者サービスを使用していることを確認します( バージョン8.4.0以降には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'
次に、xmlレイアウトにPlaceAutoCompleteFragmentを含めます:
<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>
次に、アクティビティにリスナーを設定します。
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;
}
}
このコードを実行すると、Googleマップの上にオートコンプリートバーが表示されます。
オートコンプリートバーをクリックすると、次のようになります。
次に、入力を開始し、場所を選択します。
場所をタップして選択すると、PlaceSelectionListenerからログが表示されます。
D/Maps: Place selected: San Francisco
はい、その場所を押したときにaddMarkerのmakeメソッドによってそれを行うことができます。このコードを使用できます。
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));
}
}