2

我試圖通過Google地圖Android API v2從Google地圖中顯示自定義對話框,一旦點擊了地圖中的自定義標記。自定義標記將顯示放置位置的當前交通狀況。自定義對話框包含該地點的名稱,當前道路的北行和南行交通狀況,一些諮詢(如可用)(如正在建設中的道路等)以及交通更新的時間。所有這些數據都來自XML文件,並存儲在sqlite數據庫中。我現在的問題是,當我點擊任何標記時,它只顯示查詢中第一個數據的對話框。我知道我的查詢是正確的,因爲標記包含與交通狀況有關的正確圖標。我想這個問題只是在循環過程中。我也嘗試使用for循環,但生成了相同的輸出。任何人都可以幫助我實現我的目標嗎?任何幫助或建議將不勝感激。提前致謝。如何在Google地圖Android中點擊標記時顯示對話框

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(); 
     } 
    } 
} 
+0

在ItemizedOverlay類中,onTap()上有一個函數。使用它。 – 2013-02-10 10:18:51

+0

我無法使用它,因爲我使用的是版本2的Google Maps API的最新版本。 – sharic19 2013-02-10 15:26:35

+0

我現在可以通過上面給出的代碼顯示對話框。真正的問題是,它沒有在每個對話框中顯示正確的內容。標記和對話框的所有數據都來自數據庫。點擊每個標記時,應根據數據庫內的數據顯示一個對話框,其數據與另一個不同。但是,只有當點擊任何可用標記時,它纔會顯示數據庫中的一個數據(我認爲是第一個數據)。 – sharic19 2013-02-10 15:32:09

回答

0

您對每個數據元素調用mMap.setOnMarkerClickListener一次。你應該只調用一次。您應該將來自數據庫的數據存儲在由標記ID索引的地圖中。然後,當用戶點擊標記時,您可以檢索它並顯示適當的信息。

相關問題