これを行う方法が見つからなかったので、独自のクリック ロジックを作成しました。これは、私が今のところ氷上に置いたプロジェクトからのもので、進行中の作業です (ハードコードされた値など) が、ロジックは機能します。それが役に立てば幸い:
@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;
}
基本的な考え方は、ユーザーが地図上でクリックしたポイントを取得し、そのポイントを緯度経度に変換してから、データ ポイントを反復して一致を探すことです。私は +/- 30 ピクセルのヒット テストを使用していることに注意してください (これをもう一度取り上げるときはハード コードしません。
似たようなものに出くわした場合に備えて、TODO を残しましたが、PinDetailsDialog クラスの実装のどこかに完全に問題があると思われます。
複数のマップ ビューを使用しており、それぞれが SQLite テーブルに格納されたデータを使用しています。データを読み取るカーソルへの参照を Mapview のタグ プロパティに保存するため、.getTag() を呼び出します。