OSMbonusPack泡泡标题不会出现

时间:2015-07-27 21:01:36

标签: java android osmdroid

上下文

我正在为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>

1 个答案:

答案 0 :(得分:0)

真正令人惊讶的是你的应用程序没有崩溃:

将CustomInfoWindow设置为startMarker,而不设置任何相关的POI对象。 但是在CustomInfoWindow.onOpen中,你得到了相关的对象,如果它不是空的话,如果它真的是一个POI,就不用测试就可以使用它。 这不行。

定义一个&#34; StartInfoWindow&#34; class,或确保您的CustomInfoWindow完全支持您的startMarker。

提示:在所有POI标记之间共享相同的CustomInfoWindow对象。它更快,更好的记忆。