Android mapView ItemizedOverlay setFocus не работает должным образом - PullRequest
4 голосов
/ 29 апреля 2010

Вызов setFocus(null) на ItemizedOverlay не «расфокусирует» текущий маркер. Согласно документации:

... Если Предмет не найден, это не опек. Вы также можете передать NULL, чтобы удалить фокус.

Вот мой код:

MapItemizedOverlay

public class MapItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();

    public MapItemizedOverlay(Drawable defaultMarker) {
        super(defaultMarker);
    }

    public void addOverlay(OverlayItem overlay) {
        items.add(overlay);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return items.get(i);
    }

    @Override
    public int size() {
        return items.size();
    }

}

Создание наложения карты и одного маркера:

StateListDrawable youIcon = (StateListDrawable)getResources().getDrawable(R.drawable.marker_icon);
int width = youIcon.getIntrinsicWidth();
int height = youIcon.getIntrinsicHeight();
youIcon.setBounds(-13, 0-height, -13+width, 0);
GeoPoint location = new GeoPoint(40800816,-74122009);

MapItemizedOverlay overlay = new MapItemizedOverlay(youIcon);
OverlayItem item = new OverlayItem(location, "title", "snippet");
overlay.addOverlay(item);
mapView.getOverlays().add(overlay);

R.drawable.marker_icon определяется следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/marker_selected" />
    <item android:state_selected="true" android:drawable="@drawable/marker_selected" />
    <item android:drawable="@drawable/marker_normal" />
</selector>

Теперь, чтобы проверить поведение setFocus (), я поместил кнопку в окне активности со следующим слушателем onClick:

Button focusBtn = (Button)findViewById(R.id.focusbtn);
focusBtn.setOnClickListener(new OnClickListener() {             
    @Override
    public void onClick(View v) {
        for(Overlay ov : mapView.getOverlays())
        {
            if(ov.getClass().getSimpleName().equals("MapItemizedOverlay") == true)
            {
                MapItemizedOverlay miv = (MapItemizedOverlay)ov;
                if(miv.getFocus() == null)
                    miv.setFocus(miv.getItem(0));
                else
                    miv.setFocus(null);
                break;
            }
        }
        mapView.invalidate();
    }
});

Ожидаемое поведение: нажатие кнопки переключает выбор маркера.

Работает только один раз - при первом щелчке по нему выбирается маркер, при повторном нажатии он не отменяется. Самое странное в этом то, что после вызова setFocus (null) getFocus () также возвращает null - как в оверлее нет фокусированного элемента (я его отладил). Но даже после вызова mapView.invalidate () маркер по-прежнему отображается в «выделенном» (сфокусированном) состоянии.

Ответы [ 2 ]

5 голосов
/ 29 апреля 2010

Как сказал Рпонд в комментарии к моему вопросу, это похоже на открытую ошибку в API.

Тем временем я решил это сам. Ниже приведен обходной код. Вам нужно расширить класс OverlayItem и проверить, что возвращает overlay.getFocus().

public class MapOverlayItem extends OverlayItem {

    MapItemizedOverlay overlay = null;

    public MapOverlayItem(GeoPoint point, MapItemizedOverlay ov)
    {
        super(point, null, null);
        this.overlay = ov;
    }

    public MapOverlayItem(GeoPoint point, String title, String snippet) {
        super(point, title, snippet);
    }

    @Override
    public Drawable getMarker(int stateBitset) {
        Drawable icon = overlay.getDefaultMarker();

        if(stateBitset == 0)
            return icon;

        OverlayItem focusedItem = overlay.getFocus();

        if(focusedItem == null) {
            OverlayItem.setState(icon, 0);
            return icon;
        }

        if(focusedItem.equals(this) == true)
            OverlayItem.setState(icon, stateBitset);
        else
            OverlayItem.setState(icon, 0);

        return icon;        
    }
}
3 голосов
/ 29 апреля 2010
...