マップ化されたマーカーを持つマップビューを持っています。ユーザーがマーカーではないマップ上のポイントに触れると、アクションAを実行します。ユーザーがマーカーを選択した場合は、onTapメソッドを使用して別のアクションを実行します。問題は、私が使用するすべての手法で、ユーザーがマーカーをタップしたときに両方のアクションが得られることです。私はこの仕事をする上で、どんなアイデアにも大変感謝しています。私はコードを投稿しますが、私が試したすべてのコードは、それが正常に動作するために失敗しました! :)すべての助けを感謝します。mapmarkerが選択されている場合は1つのアクションを実行し、そうでない場合は別のアクションを実行します。
私はこれを理解しました。onTapでスーパークラスを呼び出す必要があります。次に、両方のonTapメソッドを使用します。コードとコメントを参照してください。マーカーアクションの
public class MarkerMapOverlay extends ItemizedOverlay<OverlayItem> {
Context mContext;
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public MarkerMapOverlay(Drawable defaultMarker, Context context) {
super(boundCenter(defaultMarker));
mContext = context;
}
public void addOverlay(OverlayItem marker) {
mOverlays.add(marker);
populate();
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
public boolean onTap (final GeoPoint p, final MapView mapView){
//call the superclass, did it hit a marker? If yes, it returns true onTap(index)
//returned a marker and event is handled and we do stuff with the marker in onTap(index)
if (super.onTap(p, mapView)) {
return true;
}
//We did not hit a marker, do other stuff and return the event has handled.
Toast.makeText(mContext, "touch", Toast.LENGTH_SHORT)
.show();
return true;
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
は、あなたがイベントを消費することを示すために 'ONTAP()'から 'true'を返すをしていますか? – CommonsWare
はい、私は真を返します。私は本質的に2つのMapLayersを持っています。 1つはマーカーが付いた項目化されたレイヤーです。もう1つはonTouchEvent on ..を呼び出す単なるレイヤーです。下の1つの答えで、私はOnTouchListenerを使用していることがわかります。私はその答えを試してレポートを返します。それでも、私が見る問題は、レイヤーが相互に排他的ではないということです。マーカーをタップすると、OnTouchListenerを起動して両方のアクションを実行します。 –
を試してみるまで、 onTouchEvent on "onTouchEvent()'を呼び出しません。 OSは 'onTouchEvent()'を呼び出します。 – CommonsWare