安卓Google地图添加自定义标记名称

10

我有这样的代码:

protected void onPostExecute(final ArrayList<HashMap<String, String>> adapter) {

                for (final HashMap<String, String> a : adapter) {
                    LatLng pos = new LatLng(Double.valueOf(a.get(TAG_latitude)), Double.valueOf(a.get(TAG_longitude)));
                    Log.e("pppppos", String.valueOf(pos.latitude));
                    Marker m = map.addMarker(new MarkerOptions().position(pos)
                            .title(a.get(TAG_NAME))
                            .snippet("Kiel is cool"));

                    map.setOnInfoWindowClickListener(
                              new OnInfoWindowClickListener(){
                                    public void onInfoWindowClick(Marker marker){
                                      Intent nextScreen = new Intent(SearchExchangerActivity.this, BankExchangersListActivity.class);
                                        nextScreen.putExtra("exchanger_id", id);    
                                        startActivityForResult(nextScreen, 0);
                                    }
                                  });
                }

但是我需要将每个标记的用户不可见字段设置为例如Tag_id,然后在发送额外信息到其他活动时使用此id,类似于:

但是我需要为每个标记设置一个对用户不可见的字段,例如Tag_id,并在将额外信息发送到其他活动时使用该字段,类似于:

protected void onPostExecute(final ArrayList<HashMap<String, String>> adapter) {

            for (final HashMap<String, String> a : adapter) {
                LatLng pos = new LatLng(Double.valueOf(a.get(TAG_latitude)), Double.valueOf(a.get(TAG_longitude)));
                Marker m = map.addMarker(new MarkerOptions().position(pos)
                        .title(a.get(TAG_NAME))
                        .snippet("Kiel is cool")
                                                    .Tag_id(TAG_ID));

                map.setOnInfoWindowClickListener(
                          new OnInfoWindowClickListener(){
                                public void onInfoWindowClick(Marker marker){
                                  Intent nextScreen = new Intent(SearchExchangerActivity.this, BankExchangersListActivity.class);
                                    nextScreen.putExtra("exchanger_id", marker.get(TAG_ID));    
                                    startActivityForResult(nextScreen, 0);
                                }
                              });
            }

这可行吗?我该如何在我的听众中获取我点击的标记?

也可以通过标题字段完成... 但是当我编写 marker.getTitle() 时,会出现错误...

更新

for (final HashMap<String, String> a : adapter) {
                LatLng pos = new LatLng(Double.valueOf(a.get(TAG_latitude)), Double.valueOf(a.get(TAG_longitude)));
                Log.e("pppppos", String.valueOf(pos.latitude));
                HashMap<Marker, String> m = new HashMap<Marker, String>();
                        m.put( map.addMarker(new MarkerOptions().position(pos)
                        .title(a.get(TAG_NAME))
                        .snippet("Kiel is cool")), "1");                    

            }

            map.setOnInfoWindowClickListener(
              new OnInfoWindowClickListener(){
                    public void onInfoWindowClick(HashMap<Marker, String> marker){
                      Intent nextScreen = new Intent(SearchExchangerActivity.this, BankExchangersListActivity.class);
                        nextScreen.putExtra("exchanger_id", "1");   
                        startActivityForResult(nextScreen, 0);
                    }
                  });
2个回答

11
  1. 你可以使用Map<Marker, String>来存储数据或者
  2. 使用Android Maps Extensions,它会在Marker类中添加getDatasetData函数。

顺便说一下,不应该在循环中设置InfoWindowAdapter。这没有任何意义。只有最后一个能生效。


1
你能给出使用Map<Marker, String>的例子吗? - Valdis Azamaris
1
@ValdisAzamaris 请查看此处有关使用“Map”的解决方法:http://code.google.com/p/gmaps-api-issues/issues/detail?id=4650 - MaciejGórski
在监听器中出现了一些问题...我在OnInfoWindowClickListener上看到了错误。 - Valdis Azamaris
@DídacPérez 是的,Marker参数指的是一个完全不同的对象,但是MarkerequalshashCode方法返回的值与从addMarker方法中最初返回的对象相同。因此,Map将返回正确的模型(所讨论的String对象)。如果这对你不起作用,请在你的代码中寻找错误。同时阅读这篇文章 - MaciejGórski
如何在循环中获取infowindow数据,或者我应该为此做些什么?我得到了JSON对象数据,我需要将这个JSON数据解析成infowindow元素集。如果我在Google地图上添加经纬度,那么这很容易。 - Amitsharma
显示剩余3条评论

3

目前已正式提供,Marker API 中已添加了 setTaggetTag

以下内容摘自官方文档的 "将数据与标记相关联" 章节:

/**
 * A demo class that stores and retrieves data objects with each marker.
 */
public class MarkerDemoActivity extends FragmentActivity implements
        OnMarkerClickListener,
        OnMapReadyCallback {

    private static final LatLng PERTH = new LatLng(-31.952854, 115.857342);
    private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
    private static final LatLng BRISBANE = new LatLng(-27.47093, 153.0235);

    private Marker mPerth;
    private Marker mSydney;
    private Marker mBrisbane;

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.marker_demo);

        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    /** Called when the map is ready. */
    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;

        // Add some markers to the map, and add a data object to each marker.
        mPerth = mMap.addMarker(new MarkerOptions()
                .position(PERTH)
                .title("Perth");
        mPerth.setTag(0);

        mSydney = mMap.addMarker(new MarkerOptions()
                .position(SYDNEY)
                .title("Sydney");
        mSydney.setTag(0);

        mBrisbane = mMap.addMarker(new MarkerOptions()
                .position(BRISBANE)
                .title("Brisbane");
        mBrisbane.setTag(0);

        // Set a listener for marker click.
        mMap.setOnMarkerClickListener(this);
    }

    /** Called when the user clicks a marker. */
    @Override
    public boolean onMarkerClick(final Marker marker) {

        // Retrieve the data from the marker.
        Integer clickCount = (Integer) marker.getTag();

        // Check if a click count was set, then display the click count.
        if (clickCount != null) {
            clickCount = clickCount + 1;
            marker.setTag(clickCount);
            Toast.makeText(this,
                           marker.getTitle() +
                           " has been clicked " + clickCount + " times.",
                           Toast.LENGTH_SHORT).show();
        }

        // Return false to indicate that we have not consumed the event and that we wish
        // for the default behavior to occur (which is for the camera to move such that the
        // marker is centered and for the marker's info window to open, if it has one).
        return false;
    }
}

请注意,标签的getter和setter仅在Google Play服务9.4.0及以上版本中可用。 - Skoua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接