【发布时间】:2023-03-29 03:45:01
【问题描述】:
嘿 Stackoverflow 社区,
我正在为一个学术项目开发一个 android 应用程序,目标是使用 API 检索数据并使用标记将其显示在地图上。
当用户点击标记时,我想在片段中显示一些细节。我使用 beginTransaction 和 setArguments 这样做,它适用于一个标记。 我的问题是我的标记是在 for 循环中创建的,我只能从循环的最后一次迭代中检索参数。
这是我的 mainActivity 中的循环:
JSONObject jsonObject = new JSONObject(res);
JSONArray results = jsonObject.getJSONArray("results");
for (int i = 0; i < results.length(); i++ ) {
String name = placeList.get(i).getName();
double lat = placeList.get(i).getLat();
double lng = placeList.get(i).getLng();
map.addMarker(new MarkerOptions()
.position(new LatLng(lat, lng))
.title());
// CustomOnMarkerClickListener(place) implements GoogleMap.OnMarkerClickListener
map.setOnMarkerClickListener(new CustomOnMarkerClickListener(place));
}
这是我的自定义 OnMarkerClickListener
public class CustomOnMarkerClickListener implements GoogleMap.OnMarkerClickListener {
JSONObject place;
public CustomOnMarkerClickListener(JSONObject place) {
this.place = place;
}
@Override
public boolean onMarkerClick(Marker marker) {
InfoPanelActivity ipa = new InfoPanelActivity();
FragmentManager fm = getSupportFragmentManager();
Bundle args = new Bundle();
args.putString("place", place.toString());
ipa.setArguments(args);
if(findViewById(R.id.textView2) == null) {
fm.beginTransaction()
.add(R.id.info_panel_frame, ipa)
.commit();
} else {
fm.beginTransaction()
.replace(R.id.info_panel_frame, ipa)
.commit();
}
return false;
}
}
这就是我如何在片段中获得论点
Bundle args = getArguments();
String name = args.getString("place");
TextView tv = (TextView) getView().findViewById(R.id.textView2);
tv.setText("test: " + name);
如果你能提供帮助,我真的很感激,我真的不知道如何解决这个问题。
谢谢
【问题讨论】:
-
由于地图上只能设置一个
OnMarkerClickListener,因此您需要一种方法来查找有关侦听器内部标记的信息。这表明您需要一种方法来标记带有 JSONArray 索引之类的标记,以便在单击它时可以检索数据。查看MarkerOptions的javadoc,我看不到任何可以让您将任何自定义数据附加到它的东西(对于从addMarker()返回的Marker对象也是如此),这让我有点难过,让我想知道为什么谷歌并没有为此提供负担...... -
似乎解决方案是使用您自己的数据结构将从
addMarker()返回的Marker映射到您拥有的一些数据。这篇文章描述了这样一种方法:stackoverflow.com/a/13902666/1207921
标签: java android google-maps android-fragments google-maps-markers