我正在开发一款旅行应用。在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对象放到代码段中。 我想要的结果如下:
如何在InfoWindows上显示图像,任何建议都很棒!
答案 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就不会显示,直到获得图像,但这会导致一些延迟。