上記のように2つのクリック可能なボタンを備えたカスタム情報ウィンドウが必要です。その中にマーカーがあり、それらのいずれかをクリックすると、ウィンドウが開き、別のマーカーをクリックすると、別のウィンドウがシングルクリックで前のウィンドウを開閉します。 Googleマップv2がボタン、チェックボックスなどのライブコンポーネントをサポートしない特定の理由はありますか?
あなたが達成しようとしていることは可能です。
この回答でレシピを見ることができます: https://stackoverflow.com/a/15040761/2183804
そして、 Google Play の実用的な実装。
MainActivity.Java
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainActivity extends Activity {
private ViewGroup infoWindow;
private TextView infoTitle;
private TextView infoSnippet;
private Button infoButton1, infoButton2;
private OnInfoWindowElemTouchListener infoButtonListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapwrapperlauot);
final MapFragment mapFragment =
(MapFragment) getFragmentManager().findFragmentById(R.id.map);
final MapWrapperLayout mapWrapperLayout =
(MapWrapperLayout) findViewById(R.id.map_relative_layout);
final GoogleMap map = mapFragment.getMap();
mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20));
final Marker ki = map.addMarker(new MarkerOptions()
.position(new LatLng(50.08, 14.43))
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.circles)));
infoWindow = (ViewGroup) getLayoutInflater()
.inflate(R.layout.activity_main, null);
infoButton1 = (Button) infoWindow.findViewById(R.id.b1);
infoButton2 = (Button) infoWindow.findViewById(R.id.b2);
infoButtonListener = new OnInfoWindowElemTouchListener(infoButton1,
getResources().getDrawable(R.drawable.ic_launcher),
getResources().getDrawable(R.drawable.ic_launcher)) {
@Override
protected void onClickConfirmed(View v, Marker marker) {
Toast.makeText(getApplicationContext(),
"click on button 1", Toast.LENGTH_LONG).show();
}
};
infoButton1.setOnTouchListener(infoButtonListener);
infoButtonListener = new OnInfoWindowElemTouchListener(infoButton2,
getResources().getDrawable(R.drawable.ic_launcher),
getResources().getDrawable(R.drawable.ic_launcher)) {
@Override
protected void onClickConfirmed(View v, Marker marker) {
Toast.makeText(getApplicationContext(),
"click on button 2", Toast.LENGTH_LONG).show();
}
};
infoButton2.setOnTouchListener(infoButtonListener);
infoWindow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
map.setInfoWindowAdapter(new InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
infoButtonListener.setMarker(marker);
mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
return infoWindow;
}
@Override
public View getInfoContents(Marker marker) {
// Setting up the infoWindow with current's marker info
return null;
}
});
ki.showInfoWindow();
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(50.08, 14.43), 15));
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
}
public static int getPixelsFromDp(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
}
activity_main
<RelativeLayout 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"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"
Android:background="@drawable/marker" >
<Button
Android:id="@+id/b1"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"
Android:text="Button1"
Android:layout_marginBottom="10dp" />
<Button
Android:id="@+id/b2"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"
Android:text="Button2"
Android:layout_marginBottom="10dp" />
</LinearLayout>
</RelativeLayout>
リンクから次のファイルをコピーします https://stackoverflow.com/a/15040761/2183804
それが動作します。
あなたが達成しようとしていることは不可能です。情報ウィンドウのXMLレイアウトを作成した場合でも、情報ウィンドウのコンテンツはレンダリングされ、マップ上に画像として表示されます。そのため、ウィンドウ全体に対してクリックリスナを1つだけ受け入れることができます。 1つのウィンドウに複数のクリックリスナーを指定することはできません。
更新: Docs :から
注:描画される情報ウィンドウはライブビューではありません。ビューは、返される時点で(View.draw(Canvas)を使用して)イメージとしてレンダリングされます。これは、ビューに対する以降の変更がマップ上の情報ウィンドウに反映されないことを意味します。情報ウィンドウを後で更新するには(たとえば、画像が読み込まれた後)、showInfoWindow()を呼び出します。さらに、情報ウィンドウは、タッチイベントやジェスチャイベントなどの通常のビューに典型的な対話性を尊重しません。ただし、以下のセクションで説明するように、情報ウィンドウ全体で一般的なクリックイベントをリッスンできます。
この質問のサンプルAndroid studioプロジェクトを作成しました。
スクリーンショットを出力:-
完全なプロジェクトソースコードをダウンロードクリックここ
注意してください:Androidmanifest.xmlにAPIキーを追加する必要があります
実際には、問題を解決し、ライブビューである情報ウィンドウを追加できるライブラリがあり、それと対話できます。