5

Tôi hiện đang hiển thị một điểm đánh dấu duy nhất. Khi chạm vào cửa sổ thông tin sẽ KHÔNG hiển thị. Tôi đã xác nhận rằng tiêu đề thực sự được đặt trong điểm đánh dấu.Bản đồ v2 Cửa sổ thông tin không hiển thị khi điểm đánh dấu được chạm vào, nhưng sau khi chạm vào Cửa sổ thông tin ẩn

Tuy nhiên, nếu tôi chạm vào khu vực phía trên điểm đánh dấu có cửa sổ thông tin, tôi sẽ nhận được sự kiện OnInfoWindowClickListener. Khi điều này xảy ra, tôi mở một hoạt động khác và khi tôi trở lại từ hoạt động này, cửa sổ thông tin được hiển thị (thực ra, tôi có thể thấy nó được hiển thị một giây trước khi hoạt động bắt đầu).

Bất kỳ mẹo nào về cách tôi có thể hiển thị cửa sổ thông tin khi điểm đánh dấu được chạm vào?

Đây là mã có liên quan của tôi:

// .... more code up here 


final GoogleMap map = mMapFragment.getMap(); 

if (map == null) { 
    mReloadWhenReady = true; 
    return; 
} 

map.clear(); 

final TileProviderMapsV2 prov = new TileProviderMapsV2(mMapFragment.getActivity()); 
map.addTileOverlay(new TileOverlayOptions().tileProvider(prov)); 


final LatLngBounds.Builder bounds = new LatLngBounds.Builder(); 
final Map<Marker, MyNode> markerMap = J.newHashMap(); 
mNodes.clear(); 
mNodes.addAll(nodes); 


L.p("Maps v2 nodes: %d. ", mNodes.size()); 



for (MyNode node : mNodes) { 
    final LatLng latlng = new LatLng(node.getLat(), node.getLon()); 
    final MarkerOptions opts = new MarkerOptions() 
      .position(latlng) 
      .title("Title is " + node.getName()) 
      .icon(BitmapDescriptorFactory 
      .fromResource(com.mydomain.droid.R.drawable.pin_blue)); 

    final Marker m = map.addMarker(opts); 
    markerMap.put(m, node); 
    bounds.include(latlng); 
} 

map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { 

    @Override 
    public void onInfoWindowClick(Marker marker) { 
     final MyNode node = markerMap.get(marker); 
     L.p("Maps v2 Clicked Node: %s/%d. ", node.getName(),node.getId()); 
     ViewNode.Launchr.setNodeId(node.getId()).launch(mMapFragment.getActivity()); 
    } 
}); 

Nếu tôi thêm m.showInfoWindow(); bên trong vòng lặp for marker sẽ hiển thị cửa sổ thông tin, tuy nhiên trong tương lai sẽ có đánh dấu nhiều hơn, do đó yêu cầu là chỉ hiển thị cửa sổ thông tin khi điểm đánh dấu được chạm vào.

Đối với mục đích gỡ lỗi tôi đã thêm đoạn mã sau, và tôi nhìn thấy tin nhắn trong các bản ghi cùng với các tiêu đề chính xác, nhưng tôi không nhận được cửa sổ thông tin:

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 

    @Override 
    public boolean onMarkerClick(Marker marker) { 
     L.p("marker clicked " + marker.getTitle()); 
     marker.showInfoWindow(); 
     return false; 
    } 
}); 

Cảm ơn!

+0

bạn đã thiết lập một ' OnCameraChangeListener'? Nếu vậy, bạn có thể đăng mã 'onCameraChange' của mình không? – antonio

Trả lời

0

Cố gắng làm điều này:

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 

    @Override 
    public boolean onMarkerClick(Marker marker) { 
     marker = m; 
     L.p("marker clicked " + marker.getTitle()); 
     marker.showInfoWindow(); 
     return false; 
    } 
}); 
+0

'Phương thức showInfoWindow() không được xác định cho loại MarkerOptions' – zundi

+0

xem câu trả lời đã chỉnh sửa của tôi –

+0

Xin chào Hammad, tôi đã cập nhật câu hỏi ban đầu với đề xuất của bạn để thêm' showInfoWindow() 'vào vòng lặp for. Điều này sẽ hiển thị cửa sổ thông tin, tuy nhiên tôi cần nó sẽ được hiển thị chỉ khi điểm đánh dấu được chạm vào (đó sẽ là hành vi mặc định của điểm đánh dấu). – zundi

0

Không chắc lý do tại sao bạn đang gặp vấn đề vẽ này, nhưng tôi sẽ cung cấp cho bạn một số mẹo có thể hoặc không thể sửa chữa nó.

Trước hết, bạn nên loại bỏ khối nếu kiểm tra xem bản đồ đã sẵn sàng chưa và cũng loại bỏ cờ mReloadWhenReady. Cách chính xác để khởi tạo bản đồ google đang sử dụng getMapAsync từ đoạn Bản đồ của bạn.

Vì vậy, hãy triển khai GoogleMap.OnInfoWindowClickListenerOnMapReadyCallback trong lớp học của bạn Và thực hiện như sau để khởi tạo, thiết lập và sử dụng bản đồ.

tuyên bố bản đồ biến thành viên

private GoogleMap map = null; 

Sau đó, ở đâu đó trong lớp học của bạn khởi tạo mà bản đồ

mMapFragment.getMapAsync(this); 

sau đó viết một số mã bên trong các phương pháp đó overriden

@Override 
    public void onMapReady(GoogleMap googleMap) 
    { 
     //here you can be sure the map is initialized correctly 
     this.map = googleMap; 
     //here we set the info window listener 
     map.setOnInfoWindowClickListener(this); 
     setupMap() //your custom method for doing whatever you want to do with the map see below 
    } 

    //Do your stuff on onInfoWindowClick as usual 
    @Override 
    public void onInfoWindowClick(Marker marker) { 
     final MyNode node = markerMap.get(marker); 
     L.p("Maps v2 Clicked Node: %s/%d. ", node.getName(),node.getId()); 
     ViewNode.Launchr.setNodeId(node.getId()).launch(mMapFragment.getActivity()); 
    } 



private void setupMap() 
{ 

    map.clear(); 

    final TileProviderMapsV2 prov = new TileProviderMapsV2(mMapFragment.getActivity()); 
    map.addTileOverlay(new TileOverlayOptions().tileProvider(prov)); 


    final LatLngBounds.Builder bounds = new LatLngBounds.Builder(); 
    final Map<Marker, MyNode> markerMap = J.newHashMap(); 
    mNodes.clear(); 
    mNodes.addAll(nodes); 


    L.p("Maps v2 nodes: %d. ", mNodes.size()); 



    for (MyNode node : mNodes) { 
     final LatLng latlng = new LatLng(node.getLat(), node.getLon()); 
     final MarkerOptions opts = new MarkerOptions() 
       .position(latlng) 
       .title("Title is " + node.getName()) 
       .icon(BitmapDescriptorFactory 
       .fromResource(com.mydomain.droid.R.drawable.pin_blue)); 

     final Marker m = map.addMarker(opts); 
     markerMap.put(m, node); 
     bounds.include(latlng); 
} 
Các vấn đề liên quan