Я делаю приложение для Android в качестве школьного проекта.Это в основном приложение погоды, которое позволяет пользователю отправлять информацию о погоде в местном масштабе и делиться ею с другими людьми.
Базовая реализация требует использования Google Maps для отображения некоторого маркера и всплывающего окна при нажатии на маркер.
Теперь вот проблема, маркеры отображаются правильно, но когда я нажимаю на один из них, чтобы отобразить всплывающее окно, маркер перемещается из исходной позиции и вместе с ним все маркеры, которые используют один и тот же ресурс ...
Вот два снимка экрана, представляющих, что происходит:
Исходная ситуация - После нажатия и закрытия всплывающего окна (снимок экрана слишком велик, чтобы вставить его)
Как вы можете заметить из рисунка 2, три маркера переместились на юг ... Я знаю, что проблема вызвана всплывающим окном, но я действительно не могу понять, что является причиной изменения.
Код действительно прост, я написал его во время поиска информации, поэтому он, вероятно, похож на другой пример.
РасширениеКласс ItemizedOverlay
public class ItemizedWeather extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();
private MapView mapView;
private Drawable defaultMarker;
private MarkerPopup popup;
public ItemizedWeather(Drawable defaultMarker, MapView mapView) {
super(boundCenterBottom(defaultMarker));
this.defaultMarker = defaultMarker;
this.mapView = mapView;
// popup setup
this.popup = new MarkerPopup(mapView);
// parameter
MapView.LayoutParams params = new MapView.LayoutParams(
MapView.LayoutParams.WRAP_CONTENT, // width
MapView.LayoutParams.WRAP_CONTENT, // height
null,
MapView.LayoutParams.BOTTOM_CENTER
);
params.mode = MapView.LayoutParams.MODE_MAP;
// visibility
popup.setVisibility(View.GONE);
// add to view
mapView.addView(popup, params);
}
@Override
protected OverlayItem createItem(int i) {
return mapOverlays.get(i);
}
@Override
public int size() {
return mapOverlays.size();
}
@Override
protected boolean onTap(int index) {
// get the clicked element
OverlayItem item = mapOverlays.get(index);
// set new item
popup.setData(item);
// position
GeoPoint point = item.getPoint();
// parameter
MapView.LayoutParams params = new MapView.LayoutParams(
MapView.LayoutParams.WRAP_CONTENT, // width
MapView.LayoutParams.WRAP_CONTENT, // height
point,
MapView.LayoutParams.BOTTOM_CENTER
);
params.mode = MapView.LayoutParams.MODE_MAP;
// change parameter
popup.setLayoutParams(params);
// visibility
popup.setVisibility(View.VISIBLE);
// move to point
mapView.getController().animateTo(point);
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) {
// Tap event
if(super.onTouchEvent(event, mapView)) return true;
// de-select
if(event.getActionMasked() == MotionEvent.ACTION_UP && popup != null) popup.setVisibility(View.GONE);
return false;
}
public void addOverlay(OverlayItem overlay, Drawable marker) {
overlay.setMarker(boundCenterBottom(marker));
mapOverlays.add(overlay);
}
public void addOverlay(OverlayItem overlay, int drawable) {
addOverlay(overlay, mapView.getResources().getDrawable(drawable));
}
public void addOverlay(OverlayItem overlay) {
addOverlay(overlay, defaultMarker);
}
public void doPopulate() {
this.populate();
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, false);
}
}
Класс MarkerPopup
public class MarkerPopup extends LinearLayout {
private TextView title;
private TextView snippet;
private ImageView image;
public MarkerPopup(MapView mapView) {
super(mapView.getContext());
setupPopup(mapView);
this.setPadding(20, 10, 20, 10);
this.setVisibility(GONE);
}
private void setupPopup(ViewGroup mapView) {
LayoutInflater inflater = (LayoutInflater) mapView.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.marker_popup, this);
title = (TextView) view.findViewById(R.id.tTitle);
snippet = (TextView) view.findViewById(R.id.tSnippet);
image = (ImageView) view.findViewById(R.id.iPopupImage);
}
public void setData(OverlayItem item) {
this.setVisibility(VISIBLE);
setObjects(item);
}
private void setObjects(OverlayItem item) {
// title
if (item.getTitle() != null) {
title.setVisibility(VISIBLE);
title.setText(item.getTitle());
title.setSelected(true);
} else {
title.setText("");
title.setVisibility(INVISIBLE);
}
// snippet
if (item.getSnippet() != null) {
snippet.setVisibility(VISIBLE);
snippet.setText(item.getSnippet());
} else {
snippet.setText("");
snippet.setVisibility(INVISIBLE);
}
// marker
if(item.getMarker(0) != null) {
image.setImageDrawable(item.getMarker(0));
}
}
}
Если здесь уместно решить проблему, всплывающий макет, раздуваемый в MarkerPopup
<?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="vertical"
android:gravity="center_horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="1.5dp" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/black_200"
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="2dp" >
<ImageView
android:id="@+id/iPopupImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/sun"
android:contentDescription="@string/icon" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="6dp"
>
<TextView
android:id="@+id/tTitle"
android:textColor="@color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/placeholder"
android:textAppearance="?android:attr/textAppearanceLarge"
android:singleLine="true"
android:scrollHorizontally="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="false" />
<TextView
android:id="@+id/tSnippet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/placeholder"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/icon"
android:src="@drawable/marker_bottom" />
</LinearLayout>
Надеюсь, чтовопрос сделан правильно, так как я впервые публикую здесь, и что есть решение.