上下文
我正在为Android编写应用程序,我使用OSMBonusPack轻松显示标记。
我显示一个标记来显示用户的位置,使用手机GPS,我添加了一个FolderOverlay来组合其他标记(这些标记表示来自维基百科的POI,使用自定义API检索)。
我在我的项目中包含了bonuspack_bubble.xml布局文件,因为我想修改它以正确缩放“更多信息”按钮。
问题
问题是POI标记在地图上正确添加(它们显示图标,点击时,信息气泡显示,填充标题和说明),但指示用户位置的第一个标记显示为空信息泡沫。
我试图删除FolderOverlay,我试图将starterMarker添加到与POI相同的叠加层中,我试图只显示starterMarker ......没有任何效果。
我做错了什么?如果您需要澄清某些要点或代码,请随时提出!
谢谢!
注意:使用osmbonuspack v5.3(AAR),osmdroid 4.3,Android Studio 1.2.2,以及使用Android 4.2.2在Galaxy S4上进行测试
代码:
主片段中的功能
public void drawMap(Location location, MapView map, LocationManager locationManager, LocationListener locationListener) {
...
final GeoPoint startPoint = new GeoPoint(location.getLatitude(), location.getLongitude());
// Now we add a marker using osmBonusPack
Marker startMarker = new Marker(map);
startMarker.setPosition(startPoint);
startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
map.getOverlays().add(startMarker);
// We can change some properties of the marker (don't forget to refresh the map !!)
startMarker.setInfoWindow(new CustomInfoWindow(map));
startMarker.setIcon(ContextCompat.getDrawable(getActivity(), R.drawable.ic_place));
startMarker.setTitle(getString(R.string.you_are_here));
map.invalidate();
...
// We create an Overlay Folder to store every POI, so that they are grouped in clusters
// if there are too many of them
RadiusMarkerClusterer poiMarkers = new RadiusMarkerClusterer(getActivity());
Drawable clusterIconD = ContextCompat.getDrawable(getActivity(), R.drawable.marker_cluster);
Bitmap clusterIcon = ((BitmapDrawable)clusterIconD).getBitmap();
poiMarkers.setIcon(clusterIcon);
map.getOverlays().add(poiMarkers);
// poiList is an ArrayList of custom POIs
for (POI poi:poiList) {
double mLat = poi.getLatitude();
double mLong = poi.getLongitude();
GeoPoint poiWaypoint = new GeoPoint(mLat, mLong);
Marker marker = new Marker(map);
marker.setPosition(poiWaypoint);
marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
marker.setRelatedObject(poi);
marker.setInfoWindow(new CustomInfoWindow(map));
marker.setTitle(poi.getName());
marker.setSnippet(poi.getSitelink());
Drawable icon = ContextCompat.getDrawable(getActivity(), R.drawable.ic_place);
marker.setIcon(icon);
poiMarkers.add(marker);
}
map.invalidate();
}
CustomInfoWindow.java
public class CustomInfoWindow extends MarkerInfoWindow {
private POI mSelectedPoi;
public CustomInfoWindow(MapView mapView) {
super(R.layout.bonuspack_bubble, mapView);
Button btn = (Button) (mView.findViewById(R.id.bubble_moreinfo));
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
if (mSelectedPoi.getSitelink() != null) {
Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mSelectedPoi.getSitelink()));
view.getContext().startActivity(myIntent);
}
}
});
}
@Override
public void onOpen(Object item){
super.onOpen(item);
mView.findViewById(R.id.bubble_moreinfo).setVisibility(View.VISIBLE);
Marker marker = (Marker)item;
mSelectedPoi = (POI)marker.getRelatedObject();
}
}
POI.java
public class POI {
// We define every variable returned by the WikiJourney API
private double latitude;
private double longitude;
private String name;
private String sitelink;
private String type_name;
private int type_id;
private int id;
public POI(...) { }
}
_bonuspack_bubble.xml _
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/bonuspack_bubble" >
<ImageView android:id="@+id/bubble_image"
android:layout_width="65dp"
android:layout_height="65dp"
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView android:id="@+id/bubble_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:maxEms="17"
android:layout_gravity="start"
android:layout_weight="1"
android:text="Title" />
<Button android:id="@+id/bubble_moreinfo"
android:background="@drawable/btn_moreinfo"
android:visibility="gone"
android:layout_width="25sp"
android:layout_height="25sp"
android:layout_gravity="end"
android:layout_weight="0" />
</LinearLayout>
<TextView android:id="@+id/bubble_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="12sp"
android:maxEms="17"
android:text="Description" />
<TextView android:id="@+id/bubble_subdescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="10sp"
android:maxEms="17"
android:text="Address"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>
答案 0 :(得分:0)
真正令人惊讶的是你的应用程序没有崩溃:
将CustomInfoWindow设置为startMarker,而不设置任何相关的POI对象。 但是在CustomInfoWindow.onOpen中,你得到了相关的对象,如果它不是空的话,如果它真的是一个POI,就不用测试就可以使用它。 这不行。
定义一个&#34; StartInfoWindow&#34; class,或确保您的CustomInfoWindow完全支持您的startMarker。
提示:在所有POI标记之间共享相同的CustomInfoWindow对象。它更快,更好的记忆。