2012-04-22 17 views
0

マップ化されたマーカーを持つマップビューを持っています。ユーザーがマーカーではないマップ上のポイントに触れると、アクション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; 
} 

}

+0

は、あなたがイベントを消費することを示すために 'ONTAP()'から 'true'を返すをしていますか? – CommonsWare

+0

はい、私は真を返します。私は本質的に2つのMapLayersを持っています。 1つはマーカーが付いた項目化されたレイヤーです。もう1つはonTouchEvent on ..を呼び出す単なるレイヤーです。下の1つの答えで、私はOnTouchListenerを使用していることがわかります。私はその答えを試してレポートを返します。それでも、私が見る問題は、レイヤーが相互に排他的ではないということです。マーカーをタップすると、OnTouchListenerを起動して両方のアクションを実行します。 –

+0

を試してみるまで、 onTouchEvent on "onTouchEvent()'を呼び出しません。 OSは 'onTouchEvent()'を呼び出します。 – CommonsWare

答えて

0

ItemizedOverlayonTapを使用しています。他のタッチアクション使用あなたのmapViewonTouchListenerについては

mapView.setOnTouchListener(new OnTouchListener() { 

    @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getBaseContext(), "touch", Toast.LENGTH_LONG).show(); 
      return false; 
     } 
    }); 
+0

これを実装する前に、私が理解していることを確認しようとしています。私がマーカーに触れると、OSはそこからonTap()を呼び出すでしょう、私はタスクAを行うことができます。しかし、私はまた、上のmapViewとやりとりしないので、setOnTouchListenerもタップを見ません。タスクBを呼び出すonTouchを呼び出すか?私はタスクAまたはタスクB、タスクAおよびタスクBは欲しくない。ありがとう。 –

+0

'onTap'は' trueを返す 'ので 'onTapListener'は呼び出されません。私はこれを1つのプロジェクトで試してみました。マーカーに触れるとAlertDialogが表示され、そうでない場合はトーストが表示されます。上位コードをMapActivityにコピーしてテストしてください。 – vtuhtan

+0

説明ありがとう。 onTapがtrueを返しても、onTapListenerは呼び出されないことに気づいていませんでした。私は試しに行くとそれを得る! –

関連する問題