1

我正在开发一个旅行应用程序。在 Google map 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 对象放到片段中。我在这里想要的结果: 在此处输入图像描述

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

4

2 回答 2

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给标记,就像使用代码片段一样。

于 2013-05-24T07:45:11.583 回答
0

经过三个小时的挠头,我用 postDelayed 处理程序解决了这个问题。这个想法是:对象,包含 infoWindow 的数据,必须有一些 Drawable 字段(例如图像)。当您第一次显示 infoWindow 时,一些 AsyncTash 或其他异步进程获取图片并将其放入图像中。您必须设置 postDealyed 可运行,它将检查图像值 everu X millis,如果它不为空,则重新显示 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 在获得图像之前不会显示,但这会导致一些延迟。

于 2014-02-09T19:53:15.020 回答