2015-07-27 3 views
0

ContextOSMbonusPack название Bubble не появляется

Я пишу приложение для Android, и я использую OSMBonusPack легко отображать маркеры.

Я показываю маркер, чтобы показать позицию пользователя, полученную с помощью телефона GPS, и я добавляю FolderOverlay для группировки других маркеров (это указывает POI из Википедии, полученной с помощью настраиваемого API).

Я включил файл макета boxpack_bubble.xml в свой проект, потому что я хотел его изменить, чтобы масштабировать кнопку «Дополнительная информация» правильно.

Проблема

Проблема заключается в том, что маркеры POI добавлены правильно на карте (они показывают значок, а при постукивании, пузырь показывает информацию, наполнился название и описание), но первый маркер, указывающий положение пользователя, отображает пустой информационный пузырь.

Я попытался удалить FolderOverlay, я попытался добавить starterMarker к тому же наложению, что и POI, я пытался отображать только стартермаркер ... Ничего не работает.

Что я делаю неправильно? Если вам нужно уточнить некоторые моменты или код, не стесняйтесь спрашивать!

Спасибо!

Примечание: с помощью osmbonuspack v5.3 (AAR), osmdroid 4.3, Android Studio 1.2.2, а также тестирование на Galaxy S4 с Android 4.2.2

Код:

Функция в основной фрагмент

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

Что действительно удивительно, что ваше приложение не катастрофа:

Вы устанавливаете CustomInfoWindow к startMarker, без установки какого-либо связанного объекта POI. Но в CustomInfoWindow.onOpen вы получаете связанный объект и используете его без тестирования, если это не null - и если это действительно POI. Это не может работать.

Определите класс «StartInfoWindow» или убедитесь, что CustomInfoWindow полностью поддерживает ваш startMarker.

Подсказка: совместно использовать тот же объект CustomInfoWindow между всеми маркерами POI. Это быстрее и лучше для памяти.

+0

Но что странно, так это то, что если я не установлю InfoWindow на startMarker, пузырь все равно будет пустым. А что касается общего CustomInfoWindow, должен ли я создать объект перед циклом for, а затем назначить его маркерам POI? Спасибо за ваш ответ, как только приложение станет более функциональным, я предлагаю его на странице «Приложения, использующие OSMBonusPack»! – Nymous