私はGoogle Map API V2を使用しており、マップ上のInfoWindow
にカスタムMarker
を作成しました。このInfoWindow
にはボタンがあります。
私の問題は、Onclicklistener/functioningをそのButton(Dummy)に設定することができないことです。
コードスニペットは次のとおりです。
public class MarkerView extends FragmentActivity implements OnMarkerClickListener,OnInfoWindowClickListener{
private GoogleMap mMap;
private Marker chennai;
private View infoWindow;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.basic_demo);
infoWindow=getLayoutInflater().inflate(R.layout.custom_info_contents, null);
mMap=((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
chennai=mMap.addMarker(new MarkerOptions().position(new LatLng(13.0810, 80.274)).anchor(2, 1).title("Android").snippet("Snippet").icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
mMap.setInfoWindowAdapter(new CustomInfoAdapter());
mMap.setOnInfoWindowClickListener(null);
mMap.setOnMarkerClickListener(this);
Button dummy=(Button) infoWindow.findViewById(R.id.dummy);
dummy.setVisibility(View.VISIBLE);
dummy.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MarkerView.this, "Dummy Button", Toast.LENGTH_SHORT).show();
}
});
}
class CustomInfoAdapter implements InfoWindowAdapter{
@Override
public View getInfoContents(Marker arg0) {
displayView(arg0);
return infoWindow;
}
@Override
public View getInfoWindow(Marker arg0) {
return null;
}
}
public void displayView(Marker arg0) {
((ImageView)infoWindow.findViewById(R.id.badge)).setImageResource(R.drawable.arrow);
((ImageView)infoWindow.findViewById(R.id.badge)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MarkerView.this, "Arrow Image", Toast.LENGTH_SHORT).show();
}
});
((TextView)infoWindow.findViewById(R.id.title)).setText(arg0.getTitle());
((TextView)infoWindow.findViewById(R.id.snippet)).setText(arg0.getTitle());
}
@Override
public boolean onMarkerClick(Marker arg0) {
if(arg0.equals(chennai)){
infoWindow.setClickable(false);
}
return false;
}
@Override
public void onInfoWindowClick(Marker arg0) {
Toast.makeText(MarkerView.this, "Info window", Toast.LENGTH_SHORT).show();
}
参照してくださいInfo window click eventsthis link
情報ウィンドウはライブビューではなく、ビューがマップ上に画像としてレンダリングされます。その結果、ビューに設定したリスナーは無視され、ビューのさまざまな部分でクリックイベントを区別できなくなります。カスタム情報ウィンドウ内に、ボタン、チェックボックス、テキスト入力などのインタラクティブなコンポーネントを配置しないことをお勧めします。
カスタムマーカーを実装する必要があります。次のようなものです。
custommarker.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_vertical|center_horizontal"
Android:background="#ADD8E6"
Android:gravity="center_vertical|center_horizontal"
Android:orientation="horizontal" >
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginRight="5dp"
Android:adjustViewBounds="true"
Android:contentDescription="@string/app_name"
Android:src="@drawable/sabarmati" />
<LinearLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical" >
<TextView
Android:id="@+id/snippet"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="5dp"
Android:textColor="@Android:color/black"
Android:textSize="15sp" />
<TextView
Android:id="@+id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="5dp"
Android:textColor="@Android:color/black"
Android:textSize="10sp"
Android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
アクティビティ:
public class PlacesMapActivity extends Android.support.v4.app.FragmentActivity
implements OnClickListener, LocationListener {
/**
* Note that this may be null if the Google Play services APK is not
* available.
*/
ImageButton btn_home;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SupportMapFragment fragment = (SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map);
mMap = fragment.getMap();
mMap.setMyLocationEnabled(true);
// mMap = ((SupportMapFragment) getSupportFragmentManager()
// .findFragmentById(R.id.map)).getMap();
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.title("First Location");
markerOptions.snippet("This Is Test Location");
LatLng latlng = new LatLng(23.0333, 72.6167);
markerOptions.position(latlng);
// markerOptions.title("Ahmedabad Cordinat Found here");
// Marker m = mMap.addMarker(markerOptions);
***mMap.setInfoWindowAdapter(new InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker arg0) {
return null;
}
@Override
public View getInfoContents(Marker marker) {
View myContentView = getLayoutInflater().inflate(
R.layout.custommarker, null);
TextView tvTitle = ((TextView) myContentView
.findViewById(R.id.title));
tvTitle.setText(marker.getTitle());
TextView tvSnippet = ((TextView) myContentView
.findViewById(R.id.snippet));
tvSnippet.setText(marker.getSnippet());
return myContentView;
}
});***
mMap.addMarker(new MarkerOptions()
.position(latlng)
.title("This is Sabarmati Ashram")
.snippet("Ahmedabad")
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(getBaseContext(),
DetailsOfPlacesActivity.class);
startActivity(intent);
}
});
btn_home = (ImageButton) findViewById(R.id.activity_map_ibtn_home);
btn_home.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}
}
この質問のサンプルAndroid studioプロジェクトをビルドしました。
したがって、クリック可能なボタンやImageViewなどを含むGoogleマップv2カスタム情報ウィンドウを作成できます。
スクリーンショットを出力:-
完全なプロジェクトソースコードをダウンロードクリックここ
注意:Androidmanifest.xmlにAPIキーを追加する必要があります
@ TamiLで説明される理由 のため、ボタンをクリックできません。
ただし、InfoWindow
をクリックできます。そのため、Marker
(s)をクリック可能にするInfoWindow
(s)のIDを保存します。 、次のようにGoogleMap.OnInfoWindowClickListener
をマップに追加します。
map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
{
@Override
public void onInfoWindowClick(Marker marker)
{
// Called when ANY InfoWindow is clicked
}
});
次に、onInfoWindowClick
が呼び出されたら、クリックしたMarker
のIDを以前に保存したものと比較し、それらのいずれかが一致する場合、Button
のクリックリスナー。
すべてのMarker
s 'Marker
sがクリック可能になる場合、InfoWindow
ID:sを保存する必要はありません。
Googleマップのマーカーに表示されるInfoWindow内のUI要素はクリックできません。そのため、カスタムポップアップを使用する方が適切です。