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();
}
}
}
在ItemizedOverlay類中,onTap()上有一個函數。使用它。 – 2013-02-10 10:18:51
我無法使用它,因爲我使用的是版本2的Google Maps API的最新版本。 – sharic19 2013-02-10 15:26:35
我現在可以通過上面給出的代碼顯示對話框。真正的問題是,它沒有在每個對話框中顯示正確的內容。標記和對話框的所有數據都來自數據庫。點擊每個標記時,應根據數據庫內的數據顯示一個對話框,其數據與另一個不同。但是,只有當點擊任何可用標記時,它纔會顯示數據庫中的一個數據(我認爲是第一個數據)。 – sharic19 2013-02-10 15:32:09