4

Googleマップでは、さまざまな目的でさまざまな色のマーカーを配置しています。ここでは、マーカーごとに onMarkerclick() にさまざまな機能が必要です(例:すべての緑色のマーカー)。マーカーの

@Override
public void onMapLongClick(LatLng touchlocation) {
    // TODO Auto-generated method stub
    googleMap.addMarker(new MarkerOptions()
            .position(touchlocation)
            .title("Event")
            .icon(BitmapDescriptorFactory
                    .defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
}

ここで別のタイプのマーカー

// adding marker
        user_marker = googleMap.addMarker(new MarkerOptions()
                .position(USER_LOCATION)
                .title("User")
                .snippet("User registered Location:" + loc)
                .icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));

近くの場所については、別のタイプのマーカーを使用しています

ここで onMarkerClick() をどのように実装したか

@Override
public boolean onMarkerClick(Marker marker) {
    // TODO Auto-generated method stub
    // googleMap.clear();
    Toast.makeText(getApplicationContext(), "USER MARKER",
            Toast.LENGTH_LONG).show();
    showDialog(DIALOG_LOGIN);

    return true;
}

ここでは、マーカーの種類ごとに異なる機能が必要です。その条件を記述する方法.help me.

4

3 に答える 3

7

これを行うにはいくつかの方法があります。

すべてMarkerの に区別できる値 (タイトルなど) がある場合は、次のようにすることができます。

String title = marker.getTitle();
if ("User".equals(title)) {
    // show dialog
} else if ("Event".equals(title)) {
    // do thing for events
} else {
    // do thing for nearby places
}

これにはスニペットを使用できますが、や定数Viewなどのスニペットを表示したくない場合は、情報ウィンドウの作成に注意する必要があります。"USER""EVENT""NEARBY_PLACE"

より一般的な方法は、すべてのMarkers をSets (またはMap、 every に追加の値を割り当てたい場合は s ) に格納することですMarker

private Set<Marker> events;
private Set<Marker> nearbyPlaces;

その後、クリックMarkerされたものが次のセットのいずれかに含まれているかどうかを確認します。

if (user_marker.equals(marker)) {
    // show dialog
} else if (events.contains(marker)) {
    // do thing for events
} else if (nearbyPlaces.contains(marker)) {
    // do thing for nearby places
} else {
    // something is wrong, better call police (assuming there are only 3 kinds of markers)
}

最後になりましたが、Android Maps Extensionsを使用して醜いifステートメントを削除できます。

OnMarkerClickListenerタイプごとに1 つ作成しますMarker。例:

private OnMarkerClickListener userMarkerClickListener = new OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        // show dialog
        return true;
    }
};

private OnMarkerClickListener eventMarkerClickListener = new OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        // do thing for events
        return false;
    }
};

特定のタイプの作成時Markerに、クリック リスナーを割り当てます。

user_marker.setData(userMarkerClickListener);

オブジェクト呼び出しOnMarkerClickListenerに追加されたグローバルで:GoogleMap

@Override
public boolean onMarkerClick(Marker marker) {
    OnMarkerClickListener listener = (OnMarkerClickListener) marker.getData();
    return listener.onMarkerClick(marker);
}

3 種類しかない場合Markerは、シンプルで堅牢な 2 番目のオプションを選択します。5 つ以上、または将来変更される可能性がある場合、3 番目のオプションを使用して作成されたオブジェクト指向コードは、IMHO の保守が容易になります。

于 2013-10-05T11:12:31.853 に答える
0

次のようにすることもできます...

   String Title = marker.getTitle();
          Log.e("I am in onMarkerClick" , Title);
    if(Title.equals("Pick Me")){
        Toast.makeText(getBaseContext(),filterAddress,Toast.LENGTH_LONG).show();
        Log.e("I am in onMarkerClick", Title);
    }else if (Title.equals("Drop ME")){
        Log.e("I am in onMarkerClick" , Title);
        Toast.makeText(getBaseContext(),DropoffAdress,Toast.LENGTH_LONG).show();
    }

//タイトルはmarkeroptions.Title("指定したタイトル");

于 2015-10-12T07:53:56.477 に答える
0

マーカーごとにリスナーを作成します。このようにして、より整理された保守可能なコードが得られます。

private GoogleMap.OnMarkerClickListener portoAlegreMarkerClickListener = new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        Toast.makeText(getApplicationContext(), "Welcome to Porto Alegre", Toast.LENGTH_SHORT).show();
        return false;
    }
};

次に、マーカーを作成し、次の手順でプライベート リスナーをタグとして渡しました。これはうまくいきました。誰かがこのリスニングをより良い方法で通過する方法を知っている場合は、それを私たちと共有してください.

@Override
public void onMapReady(GoogleMap googleMap) {    
    markerPortoAlegre = googleMap.addMarker(new MarkerOptions()
            .position(portoAlegre)
            .title("Porto Alegre"));
    markerPortoAlegre.setTag(portoAlegreMarkerClickListener);
}

最後に、 を使用してグローバル リスナーを取得するインスタンスを作成しますgetTag()googleMap.setOnMarkerClickListener(this)この方法は、すべてのマーカーに対して単一のオーバーライドされた onMarkerClick メソッドを使用する場合とは異なり、マーカーのリッスンを個別にモジュール化する方法だと思います。

@Override
public boolean onMarkerClick(Marker marker) {
    GoogleMap.OnMarkerClickListener listener = (GoogleMap.OnMarkerClickListener) marker.getTag();
    //I used listener!=null to avoid an exception
    return listener != null && listener.onMarkerClick(marker);
}

この方法では、onMapReady を変更し、マーカーが必要な回数だけグローバル リスナーを追加する必要があります。最後に書いたメソッドは常に同じです。

于 2017-08-27T21:01:34.137 に答える