Android Google Maps API v2のマーカーをクリック可能にして、オプション付きのメニューを表示するか、新しいアクティビティを開始する方法を教えてください。現在、アプリのマーカーを「newb」メソッドで作成したと思います。必要な残りのコードとリンクできるように、名前やメソッドを割り当てませんでした。
googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title("My Spot")
.snippet("This is my spot!")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure)));
これに答える場合は、一意の名前で導入され、クリック可能として設定されて新しいアクティビティを開くマーカーのサンプルコードを含めてください。
Google Android Maps Api v2のすべてのマーカーはクリック可能です。マーカーに追加のプロパティを設定する必要はありません。必要なこと-マーカークリックコールバックをgoogleMapに登録し、コールバック内でクリックを処理することです。
public class MarkerDemoActivity extends Android.support.v4.app.FragmentActivity
implements OnMarkerClickListener
{
private Marker myMarker;
private void setUpMap()
{
.......
googleMap.setOnMarkerClickListener(this);
myMarker = googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title("My Spot")
.snippet("This is my spot!")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure)));
......
}
@Override
public boolean onMarkerClick(final Marker marker) {
if (marker.equals(myMarker))
{
//handle click here
}
}
}
こちらが良い マーカーのカスタマイズに関するGoogleのガイド
マーカーをマップに追加するときにsetTag(position)
。
Marker marker = map.addMarker(new MarkerOptions()
.position(new LatLng(latitude, longitude)));
marker.setTag(position);
setOnMarkerClickListener
リスナーのgetTag()
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
int position = (int)(marker.getTag());
//Using position get Value from arraylist
return false;
}
});
アクティビティの使用を避け、OnMarkerClickListenerを実装し、ローカルのOnMarkerClickListenerを使用します
// Not a good idea
class MapActivity extends Activity implements OnMarkerClickListener {
}
マーカーにリンクされた元のデータモデルを検索するには、マップが必要になります
private Map<Marker, Map<String, Object>> markers = new HashMap<>();
データモデルが必要になります
private Map<String, Object> dataModel = new HashMap<>();
データモデルにデータを入力する
dataModel.put("title", "My Spot");
dataModel.put("snipet", "This is my spot!");
dataModel.put("latitude", 20.0f);
dataModel.put("longitude", 100.0f);
データモデルを使用して新しいマーカーを作成する場合、両方をメーカーマップに追加します
Marker marker = googleMap.addMarker(markerOptions);
markers.put(marker, dataModel);
クリックマーカーイベントの場合、ローカルのOnMarkerClickListenerを使用します。
@Override
public void onMapReady(GoogleMap googleMap) {
// grab for laters
this.googleMap = googleMap;
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Map dataModel = (Map)markers.get(marker);
String title = (String)dataModel.get("title");
markerOnClick(title);
return false;
}
});
mapView.onResume();
showMarkers();
ZoomAsync zoomAsync = new ZoomAsync();
zoomAsync.execute();
}
情報ウィンドウを表示するには、マーカーマップから元のデータモデルを取得します。
@Override
public void onMapReady(GoogleMap googleMap) {
this.googleMap = googleMap;
googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Map dataModel = (Map)markers.get(marker);
String title = (String)dataModel.get("title");
infoWindowOnClick(title);
}
});
別の解決策:マーカーをそのタイトルで取得します
public class MarkerDemoActivity extends Android.support.v4.app.FragmentActivity
implements OnMarkerClickListener
{
private Marker myMarker;
private void setUpMap()
{
.......
googleMap.setOnMarkerClickListener(this);
myMarker = googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title("My Spot")
.snippet("This is my spot!")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure)));
......
}
@Override
public boolean onMarkerClick(final Marker marker) {
String name= marker.getTitle();
if (name.equalsIgnoreCase("My Spot"))
{
//write your code here
}
}
}
4つのクリック可能なマーカーを使用したマップアクティビティのコード全体を次に示します。マーカーをクリックすると情報ウィンドウが表示されます。情報ウィンドウをクリックすると、英語、ドイツ語、スペイン語、イタリア語の別のアクティビティに移動します。 OnInfoWindowClickListenerにもかかわらずOnMarkerClickListenerを使用する場合は、次の行を交換するだけです。
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
これに:
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()
この行:
public void onInfoWindowClick(Marker arg0)
これに:
public boolean onMarkerClick(Marker arg0)
そして、メソッド「onMarkerClick」の最後に:
return true;
私はそれが誰かのために役立つかもしれないと思う;)
package pl.pollub.translator;
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v4.app.FragmentActivity;
import Android.widget.Toast;
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.Marker;
import com.google.Android.gms.maps.model.MarkerOptions;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
Toast.makeText(this, "Choose a language.", Toast.LENGTH_LONG).show();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
{
@Override
public void onInfoWindowClick(Marker arg0) {
if(arg0 != null && arg0.getTitle().equals("English")){
Intent intent1 = new Intent(MapsActivity.this, English.class);
startActivity(intent1);}
if(arg0 != null && arg0.getTitle().equals("German")){
Intent intent2 = new Intent(MapsActivity.this, German.class);
startActivity(intent2);}
if(arg0 != null && arg0.getTitle().equals("Italian")){
Intent intent3 = new Intent(MapsActivity.this, Italian.class);
startActivity(intent3);}
if(arg0 != null && arg0.getTitle().equals("Spanish")){
Intent intent4 = new Intent(MapsActivity.this, Spanish.class);
startActivity(intent4);}
}
});
LatLng greatBritain = new LatLng(51.30, -0.07);
LatLng germany = new LatLng(52.3107, 13.2430);
LatLng italy = new LatLng(41.53, 12.29);
LatLng spain = new LatLng(40.25, -3.41);
mMap.addMarker(new MarkerOptions()
.position(greatBritain)
.title("English")
.snippet("Click on me:)"));
mMap.addMarker(new MarkerOptions()
.position(germany)
.title("German")
.snippet("Click on me:)"));
mMap.addMarker(new MarkerOptions()
.position(italy)
.title("Italian")
.snippet("Click on me:)"));
mMap.addMarker(new MarkerOptions()
.position(spain)
.title("Spanish")
.snippet("Click on me:)"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(greatBritain));
mMap.moveCamera(CameraUpdateFactory.newLatLng(germany));
mMap.moveCamera(CameraUpdateFactory.newLatLng(italy));
mMap.moveCamera(CameraUpdateFactory.newLatLng(spain));
}
}