Вызов 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 () маркер по-прежнему отображается в «выделенном» (сфокусированном) состоянии.