动态显示InfoWindow Googlemap V2

时间:2013-05-24 06:56:38

标签: android android-imageview google-maps-android-api-2 infowindow

我正在开发一款旅行应用。在Google地图API V2功能上,我希望每个InfoWindow都有不同的图像。

我为自定义标题和详细信息文本覆盖了WindowInfoAdapter。

public class MyInfoWindowAdapter implements InfoWindowAdapter {
    private final View  mView;
    public MyInfoWindowAdapter(Activity activity) {
        mView = activity.getLayoutInflater().inflate(R.layout.custom_info_window, null);
    }
    @Override
    public View getInfoContents(Marker marker){
        String title = marker.getTitle();
        final String snippet = marker.getSnippet();
        final TextView titleUi = (TextView) mView.findViewById(R.id.title);
        // final View subtitleUi = mView.findViewById(R.id.subtitle);
        final TextView snippetUi = ((TextView) mView.findViewById(R.id.snippet));
        final TextView placeid = ((TextView) mView.findViewById(R.id.placeid));
        final RatingBar voteUi = ((RatingBar) mView.findViewById(R.id.ratingBar1));
        final ImageView imageUi = ((ImageView) mView.findViewById(R.id.imageView1));
        titleUi.setText(title);

        //other code
        return mView;
    }

    @Override
    public View getInfoWindow(Marker marker){
        return null;
    }
}

它工作正常,因为它是字符串 现在我想使用ImageView在InforWindow上添加一个图像 问题出现是因为我使用了来自断言和流的图像。就像这样

InputStream ims = getSherlockActivity().getAssets().open("images/" + imageSubPath + "/" + splitedImages[i].toLowerCase());
Drawable iImages = Drawable.createFromStream(ims, null);

我不能像之前使用String那样将Drawable对象放到代码段中。 我想要的结果如下: enter image description here

如何在InfoWindows上显示图像,任何建议都很棒!

2 个答案:

答案 0 :(得分:4)

您必须创建额外的数据结构来保存图像,例如:

Map<Marker, Drawable> allMarkersMap = new HashMap<Marker, Drawable>();
将标记添加到GoogleMap

allMarkersMap.put(marker, iImages);
getInfoContents中的

Drawable iImages = allMarkersMap.get(marker);

并将其添加到ImageView

另一种方法是使用Android Maps Extensions,其中包含Marker.setData(Object)Object Marker.getData()等方法。这可以用来直接将Drawable分配给标记,就像使用代码段一样。

答案 1 :(得分:0)

经过三个小时的抓挠我用postDelayed处理程序解决了这个问题。 这个想法是:对象,为infoWindow提供数据,必须有一些Drawable字段(例如图像)。当您第一次显示infoWindow时,某些AsyncTash或其他异步进程会获取图片并将其置于图像中。你必须设置postDealyed runnable,它将检查图像值everu X millis,如果它变为非null,重新显示infoWindow,否则 - 设置另一个postDelayed运行。我的getInfoContents代码部分:

  final One o=data.get(id);
  View v=o.inflateMarkerInfo(this);
  if (o.image==null) {
    final Handler h=new Handler();
    h.postDelayed(new Runnable() {
      @Override
      public void run() {
        if (o.image!=null) m.showInfoWindow();
        else h.postDelayed(this, 100);
      }
    }, 100);
  }
  return v;

当然,你可以在第一次调用时返回null,这样你的infoWindow就不会显示,直到获得图像,但这会导致一些延迟。