Как показать диалог при нажатии на маркер в Google Maps Android

Я пытаюсь отобразить настраиваемое диалоговое окно из Карт Google через API Карт Google для Android v2 после нажатия настраиваемого маркера на карте. Пользовательский маркер покажет текущее состояние трафика в том месте, где он был размещен. Настраиваемый диалог содержит название места, текущие условия движения дороги в северном и южном направлении, некоторые рекомендации, если они доступны (например, дорога находится в стадии строительства и т. Д.), И время, когда данные о трафике были обновлены. Все эти данные поступали из XML-файла и хранились в базе данных sqlite. Моя проблема теперь в том, что когда я нажимаю на любой из маркеров, он показывает только диалог первых данных в запросе. Я знаю, что мой запрос был правильным, потому что маркеры содержат правильные значки в отношении состояния трафика. Думаю, проблема только в процессе зацикливания. Я также пробовал использовать цикл for, но результат был тот же. Может ли кто-нибудь помочь мне в достижении моей цели? Мы будем очень благодарны за любую помощь или предложение. Заранее спасибо.

import java.sql.Date;
import java.text.SimpleDateFormat;

import android.app.Dialog;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapViewActivity extends android.support.v4.app.FragmentActivity {

    public static final LatLng CITYHALL = new LatLng(07.0644444, 125.6077778);
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_mapview);

        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {

        if (mMap == null) {
            mMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map)).getMap();
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    private Boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni != null && ni.isConnected())
            return true;

        return false;
    }


    private void setUpMap() {

        if (isOnline()) {

            String query = "SELECT * FROM TrafficCondition";
            SQLiteDatabase db = openOrCreateDatabase("_dds", MODE_PRIVATE, null);
            final Cursor c = db.rawQuery(query, null);

            final Dialog d = new Dialog(MapViewActivity.this);
            d.setContentView(R.layout.mapview_marker_dialog);
            d.setTitle("Traffic Information");

            if (c.moveToFirst()) {
                do {
                    final int id = c.getInt(c.getColumnIndex("id"));
                    final String name = c.getString(c.getColumnIndex("name"));
                    final double lat = c.getDouble(c.getColumnIndex("lat"));
                    final double lng = c.getDouble(c.getColumnIndex("lng"));
                    final int north_condition = c.getInt(c
                            .getColumnIndex("north_condition"));
                    final int south_condition = c.getInt(c
                            .getColumnIndex("south_condition"));
                    final String north_advisory = c.getString(c
                            .getColumnIndex("north_advisory"));
                    final String south_advisory = c.getString(c
                            .getColumnIndex("south_advisory"));
                    final String icon = c.getString(c.getColumnIndex("icon"));
                    final String traffic_last_updated = c.getString(c
                            .getColumnIndex("traffic_last_updated"));

                    final SimpleDateFormat dateFormat = new SimpleDateFormat(
                            "EEE, dd MMM yyyy kk:mm:ss Z");
                    final Date app_last_updated = new Date(c.getLong(c
                            .getColumnIndex("app_last_updated")));
                    final String appLastUpdated = dateFormat
                            .format(app_last_updated);

                    mMap = ((SupportMapFragment) getSupportFragmentManager()
                            .findFragmentById(R.id.map)).getMap();

                    mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(lat, lng))
                            .icon(BitmapDescriptorFactory.fromAsset(new String(
                                    icon + ".png"))));


                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(CITYHALL,
                            12));

                    mMap.setOnMarkerClickListener(new OnMarkerClickListener() {

                        @Override
                        public boolean onMarkerClick(Marker marker) {
                            // TODO Auto-generated method stub

                            String nNoData = "NorthBound: No Data";
                            String nLightCon = "NorthBound: Light";
                            String nModerateCon = "NorthBound: Moderate";
                            String nHeavyCon = "NorthBound: Heavy";

                            String sNoData = "SouthBound: No Data";
                            String sLightCon = "SouthBound: Light";
                            String sModerateCon = "SouthBound: Moderate";
                            String sHeavyCon = "SouthBound: Heavy";

                            TextView title = (TextView) d
                                    .findViewById(R.id.traffic_con_node_title);
                            title.setText(name);

                            TextView nTrafficCon = (TextView) d
                                    .findViewById(R.id.n_traffic_con);
                            TextView sTrafficCon = (TextView) d
                                    .findViewById(R.id.s_traffic_con);

                            TextView nAdvisoryTitle = (TextView) d
                                    .findViewById(R.id.n_traffic_con_ad_title);
                            TextView sAdvisoryTitle = (TextView) d
                                    .findViewById(R.id.s_traffic_con_ad_title);

                            TextView nTrafficConAd = (TextView) d
                                    .findViewById(R.id.n_traffic_con_ad_content);
                            TextView sTrafficConAd = (TextView) d
                                    .findViewById(R.id.s_traffic_con_ad_content);

                            TextView TrafficLastUpdated = (TextView) d
                                    .findViewById(R.id.traffic_con_last_updated);

                            if (north_condition == 0) {
                                nTrafficCon
                                        .setBackgroundResource(R.drawable.n_bg_nodata);
                                nTrafficCon.setText(nNoData);
                            } else if (north_condition == 1) {
                                nTrafficCon
                                        .setBackgroundResource(R.drawable.n_bg_light);
                                nTrafficCon.setText(nLightCon);
                            } else if (north_condition == 2) {
                                nTrafficCon
                                        .setBackgroundResource(R.drawable.n_bg_moderate);
                                nTrafficCon.setText(nModerateCon);
                            } else if (north_condition == 3) {
                                nTrafficCon
                                        .setBackgroundResource(R.drawable.n_bg_heavy);
                                nTrafficCon.setText(nHeavyCon);
                            }

                            if (south_condition == 0) {
                                sTrafficCon
                                        .setBackgroundResource(R.drawable.s_bg_nodata);
                                sTrafficCon.setText(sNoData);
                            } else if (south_condition == 1) {
                                sTrafficCon
                                        .setBackgroundResource(R.drawable.s_bg_light);
                                sTrafficCon.setText(sLightCon);
                            } else if (south_condition == 2) {
                                sTrafficCon
                                        .setBackgroundResource(R.drawable.s_bg_moderate);
                                sTrafficCon.setText(sModerateCon);
                            } else if (south_condition == 3) {
                                sTrafficCon
                                        .setBackgroundResource(R.drawable.s_bg_heavy);
                                sTrafficCon.setText(sHeavyCon);
                            }

                            String empty = "null";

                            if ((north_advisory.trim().length() > 0)
                                    && (!north_advisory.equals(empty))) {
                                nAdvisoryTitle.setVisibility(View.VISIBLE);
                                nTrafficConAd.setVisibility(View.VISIBLE);
                                nTrafficConAd.setText(north_advisory);
                            } else if (nAdvisoryTitle.equals(null)) {
                                nAdvisoryTitle.setVisibility(View.GONE);
                                nTrafficConAd.setVisibility(View.GONE);
                            }

                            if ((south_advisory.trim().length() > 0)
                                    && (!south_advisory.equals(empty))) {
                                sAdvisoryTitle.setVisibility(View.VISIBLE);
                                sTrafficConAd.setVisibility(View.VISIBLE);
                                sTrafficConAd.setText(south_advisory);
                            } else {
                                sAdvisoryTitle.setVisibility(View.GONE);
                                sTrafficConAd.setVisibility(View.GONE);
                            }

                            TrafficLastUpdated.setText("Updated "
                                    + traffic_last_updated + ".");

                            d.show();
                            return false;
                        }
                    });
                } while (c.moveToNext());
            }
        } else {
            Toast.makeText(MapViewActivity.this, "No connection..",
                    Toast.LENGTH_LONG).show();
        }
    }
}

comment
В классе ItemizedOverlay есть функция onTap (). Используйте это.   -  person Fahad Ishaque    schedule 10.02.2013
comment
Я не могу использовать это, потому что я использую последнюю версию API Карт Google, которая является версией 2.   -  person sharic19    schedule 10.02.2013
comment
Теперь я могу показать диалог с помощью приведенного выше кода. Настоящая проблема в том, что он не показывает правильное содержимое в каждом диалоге. Все данные маркеров и диалогов взяты из базы данных. Каждый маркер при нажатии должен отображать диалоговое окно с данными, отличными от других, в зависимости от того, какие данные находятся в базе данных. Но он показывает только одни данные из базы данных (я думаю, самый первый), когда был нажат любой из доступных маркеров.   -  person sharic19    schedule 10.02.2013
comment
Как тебе это удалось в итоге?   -  person Johnathan Au    schedule 13.03.2013
comment
Не обращайтесь к локальной базе данных в потоке пользовательского интерфейса. Это вызывает плохой пользовательский опыт.   -  person MaciejGórski    schedule 21.03.2013
comment
И не вызывайте moveCamera и setOnMarkerClickListener в цикле.   -  person MaciejGórski    schedule 21.03.2013


Ответы (1)


Вы вызываете mMap.setOnMarkerClickListener один раз для каждого элемента данных. Вы должны позвонить ему только один раз. Вы должны хранить данные из БД на карте, проиндексированной по идентификатору маркера. Затем, когда пользователь нажимает на маркер, вы можете извлечь его и отобразить соответствующую информацию.

person Sofi Software LLC    schedule 23.08.2013