2526


現在、Google
Map上のマーカーをタップした時にinfoWindowを表示させ、次にそのinfoWindowをタップすると別のカスタムinfoWindowを表示させようとしているのですが、マーカーをタップして出てきたinfoWindowをタップしてもsetOnInfoWindowClickListener内のgetInfoContents()が呼ばれず、カスタムinfoWindowが表示されません。なぜでしょう？（getInfoContents()が複数あるから……とか？）下記にマーカー部分に関するコードを載せます。すみませんが、よろしくお願いします。

[code]

            MarkerOptions options = new MarkerOptions().position(new LatLng(latitude, longitude)).title(company).snippet(address);
            mMap.addMarker(options);
    
            mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
    
                        @Override
                        public View getInfoWindow(Marker marker) {
                            return null;
                        }
    
                        @Override
                        public View getInfoContents(Marker marker) {
                            Log.v("--->", "markerClicked");
                            return setInfoWindow(R.layout.marker_normal_window, R.id.simple_title, false, marker);
                        }
                    });
                    return false;
                }
            });
    
            mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                @Override
                public void onInfoWindowClick(Marker marker) {
                    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
    
                        @Override
                        public View getInfoWindow(Marker marker) {
                            return null;
                        }
    
                        @Override
                        public View getInfoContents(Marker marker) {
                            Log.v("--->", "infowindowClicked");
                            return setInfoWindow(R.layout.marker_detail_window, R.id.title, true, marker);
                        }
                    });
                }
            });
    
[/code]


CC BY-SA 3.0
2014-12-24T06:39:08.437
2481
2014-12-25T03:26:20.960
5210
question
android google-maps
getInfoContentsが呼ばれない


setInfoWindowAdapter を呼ぶのは一度にして、InfoWindow がクリックされたかどうかの状態を別に管理し、その状態に従って
getInfoWindow の中で処理を切り替えることで実現できます。

[code]

    private boolean mClicked;
    
    private void setUpMap() {
        mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }
    
            @Override
            public View getInfoContents(Marker marker) {
                TextView view = new TextView(MapsActivity.this);
                view.setText(marker.getTitle());
                view.setTextSize(40.f);
                if (mClicked) { // InfoWindow がクリックされた後
                    view.setTextColor(Color.rgb(0x00, 0x00, 0x99));
                } else { // InfoWindow がクリックされる前
                    view.setTextColor(Color.rgb(0x99, 0x00, 0x00));
                }
                return view;
            }
        });
    
        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                mClicked = false; // まだ InfoWindow はクリックされていません
                // false を返すことで、自動的に InfoWindow が表示されます
                return false;
            }
        });
        mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                mClicked = true;
                marker.hideInfoWindow();
                marker.showInfoWindow();
            }
        });
    }
    
[/code]

InfoWindow は getInfoWindowContents から View を返すことでカスタマイズできますが、実際は View
を画像に変換した上で表示されます。ですので、InfoWindow 上の View にイベントを結びつけることはできませんし、View
の参照を保持しておいて書き換えても画面上反映されません。onInfoWindowClick の中で一旦 InfoWindow
を非表示にして、すぐ表示しなおしています。これにより、getInfoContents が再度呼ばれます。

上の例では TextView の文字色を切り替えているだけですが、適宜書き換えてください。


CC BY-SA 3.0
2014-12-25T03:26:20.960
2526
2014-12-25T03:26:20.960
164
2481
answer