Положение смены маркера после открытия всплывающего окна на событии onTap - PullRequest
1 голос
/ 04 января 2012

Я делаю приложение для 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>

Надеюсь, чтовопрос сделан правильно, так как я впервые публикую здесь, и что есть решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...