Я не мог найти способ сделать это, так что я написал свою собственную логику щелчка. Это из проекта, который я сейчас надел на лед, и идет работа (например, жесткие кодированные значения), но логика работает. Надеюсь, что это помогает:
@Override
public boolean onTap(GeoPoint geoPoint, MapView mapView){
if (!isRoute){ // nothing to do if it's a route
Cursor cursor = (Cursor) mapView.getTag();
Projection projection = mapView.getProjection();
// get pixels for the point clicked
Point clickedPoint = new Point();
projection.toPixels(geoPoint, clickedPoint);
if (cursor.moveToFirst()){
do {
try {
Double lat = cursor.getFloat(Database.LAT_COLUMN) * 1E6;
Double lng = cursor.getFloat(Database.LONG_COLUMN) * 1E6;
GeoPoint thisGeoPoint = new GeoPoint(lat.intValue(),
lng.intValue());
// get pixels for this point
Point overlayPoint = new Point();
projection.toPixels(thisGeoPoint,overlayPoint);
// did the user click within 30 pixels?
if ((Math.abs(clickedPoint.x - overlayPoint.x) < 30) && (Math.abs(clickedPoint.y - overlayPoint.y) < 30)){
// get a cursor to this record
Cursor thisCursor = TestApp.db.rawQuery("SELECT * FROM " + Database.DATABASE_TABLE_PINS + " WHERE CID='" + cursor.getString(Database.ID_COLUMN) + "'", null);
thisCursor.moveToFirst();
// create and show an instance of the PinDetailsDialog
PinDetailsDialog customiseDialog ;
// TODO this is a kludge, why does this throw an exception sometimes?
try{
customiseDialog = new PinDetailsDialog(mapView, context,thisCursor,context.getResources().getConfiguration().orientation);
customiseDialog.show();
} catch (Exception e){
customiseDialog = new PinDetailsDialog(mapView, mapView.getContext(),thisCursor,context.getResources().getConfiguration().orientation);
customiseDialog.show();
}
return true;
}
} catch (Exception e){
e.printStackTrace();
}
} while(cursor.moveToNext());
}
}
return true;
}
Основная идея заключается в том, чтобы получить точку, где пользователь нажал на карте, преобразовать точку в Lat Long затем итерация моих точек данных ищут совпадения. Обратите внимание, что я использую тест на удар +/- 30 пикселей (который я не буду жестко кодировать, когда я снова заберу это.
Я оставил TODO там на всякий случай, когда вы натыкаетесь на что-то подобное, но я подозреваю это полностью связано с проблемой где-то в моей реализации класса PinDetailsDialog.
Я использую несколько видов карт, каждый из которых использует данные, хранящиеся в таблице SQLite. Я храню ссылку на курсор для чтения данных в свойстве тега Mapview, следовательно, вызов .getTag().