【问题标题】:Google Maps API onInfoWindowClick getTitle for all markers, not just oneGoogle Maps API onInfoWindowClick getTitle 获取所有标记,而不仅仅是一个
【发布时间】:2014-12-09 08:14:39
【问题描述】:

我已经成功地让“Keating Hall”打开了一个新活动,但是我的位置列表(标记是通过外部 JSON 文件填充的,并且名称已准备好转换为字符串)。

我想让我的所有位置 InfoWindows 都发送到我的 OptionsActivity,而不是“Keating Hall”独有的。

下面是一些处理带有硬编码值的 OnInfoWindowClickListener 的代码:

private void setUpMapIfNeeded() {
    if (map == null) {
        map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        if (map != null) {
            setUpMap();

            // allows info windows to be clicked on and open OptionsActivity
            map.setOnInfoWindowClickListener(new OnInfoWindowClickListener(){
                @Override
                public void onInfoWindowClick(Marker marker){
                    if(marker.getTitle().equals("Keating Hall")){ // TODO replace Keating Hall       with last marker clicked title
                        Intent info = new Intent(getApplicationContext(), OptionsActivity.class);
                        startActivity(info);
                    }
                }
            });
        }
    }
}

这里是处理带有每个位置标题的 JSON 数组的 void 函数:

void createMarkersFromJson(String json) throws JSONException {
    // De-serialize the JSON string into an array of city objects
    JSONArray jsonArray = new JSONArray(json);
    for (int i = 0; i < jsonArray.length(); i++) {
        // Create a marker for each city in the JSON data.
        JSONObject jsonObj = jsonArray.getJSONObject(i);
        map.addMarker(new MarkerOptions()
                        .title(jsonObj.getString("name"))
                        .snippet(Integer.toString(jsonObj.getInt("check ins")))
                        .position(new LatLng(
                                jsonObj.getJSONArray("latlng").getDouble(0),
                                jsonObj.getJSONArray("latlng").getDouble(1)
                        ))

        );
    }
}

出于对所有美好事物的热爱,我不知道用什么来替换“Keating Hall”,以便我所有的 InfoWindows 都将 Intent 发送到 startActivity --> OptionsActivity,而不仅仅是其中一个。

我在这里浏览了一堆示例,但由于我使用的是 JSON,我无法复制使我的应用程序正常工作所需的更改。

提前感谢您的帮助。

【问题讨论】:

    标签: android json google-maps


    【解决方案1】:

    我猜你的逻辑有问题。您没有调用 setUpMapIfNeeded() 或 onInfoWindowClick() 中的条件不满足。调试您的代码并检查所有条件。

    【讨论】:

    • 我正在调用 setUpMapIfNeeded。 onInfoWindowClick() 仅在字符串值被硬编码时满足,即“Keating Hall”。我有一个包含 40 多个名称的 JSON 数组转换为字符串,所以我试图实现一个值来调用所有值,可能在一个从 JSONarray 值 0-40 开始的 for 循环中。
    • 让我澄清一下:if(marker.getSnippet().equals("0") 我希望 0 的范围是 0-62,所以所有值都是 0,1,2,... ,62 包括在内。
    【解决方案2】:

    试试这个..

    还将您的 Activity 实现为

    implements OnClickListener, GoogleMap.OnMarkerClickListener
    
    GoogleMap.OnInfoWindowClickListener
    

    // 之后...在给定代码下创建时设置它

    map.setOnInfoWindowClickListener(this); 
    

    // 之后使用此代码获取所有标记的 onInfoWindowClick getTitle,而不仅仅是一个

    @Override
            public void onInfoWindowClick(Marker marker)
            {
        // and used  String m = marker.getId(); or  marker.getTitle() or marker.getSnipet
            }
    

    【讨论】:

    • 我无法让它工作。我想我可能有另一种方法。在 if(marker.getTitle().equals("title") 中,我可以将该值替换为 0-62 之间的值,这是从我的 JSON 转换为字符串的 int。我可以将它设置为 0-62 之间的任何值吗在 JSON 中是否允许 OnInfoWindowClick?
    【解决方案3】:

    我自己解决了这个问题,很简单。

    setUpMapIfNeeded() 中,以下将为所有onInfoWindowClick 打开一个新活动,但如果您想将其硬编码到某些信息窗口,您可以取消注释我拥有的标题。如果(marker.isVisible() 将其设置为为所有 InfoWindows 打开一个新活动。

    private void setUpMapIfNeeded() {
        if (map == null) {
            map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            if (map != null) {
                setUpMap();
    
                // allows info windows to be clicked on and open OptionsActivity
                map.setOnInfoWindowClickListener(new OnInfoWindowClickListener(){
                    @Override
                    public void onInfoWindowClick(Marker marker){
                        if(marker.isVisible()
                                //|| marker.getTitle().equals("title a")
                                //|| marker.getTitle().equals("title b")
                                //|| marker.getTitle().equals("title c")
                                ){ 
                            Intent info = new Intent(getApplicationContext(), OptionsActivity.class);
                            startActivity(info);
                        }
                    }
                });
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2016-07-17
      • 2014-04-24
      • 1970-01-01
      • 2018-05-10
      相关资源
      最近更新 更多