【问题标题】:Send argument to fragment in a listener in a loop在循环中向侦听器中的片段发送参数
【发布时间】: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


【解决方案1】:

当你打电话时

map.setOnMarkerClickListener(new CustomOnMarkerClickListener(place));

您正在重新设置点击侦听器,而不是添加另一个。点击监听器在地图本身上,而不是单独的标记上。在 for 循环结束时,点击侦听器将只有最后一个标记的“位置”数据。您需要将地点数据保存在每个标记内,并在您的 onMarkerClick() 方法中访问它。

类似...

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 CustomMarkerOptions()
        .position(new LatLng(lat, lng))
        .place(place)
        .title());
}

// CustomOnMarkerClickListener(place) implements GoogleMap.OnMarkerClickListener
map.setOnMarkerClickListener(new CustomOnMarkerClickListener());

然后在你的点击监听类中..

@Override
public boolean onMarkerClick(Marker marker) {
   String place = marker.place();
   ...
}

【讨论】:

  • MarkerOptions 没有 .place() 方法。您似乎建议编写一个子类,这里命名为CustomMarkerOptions,但是当单击Marker 时无法检索这样的对象(并且Marker 也没有.place() 方法)。
  • 我在想你也可以写一个自定义的 Marker 对象。您现在可以尝试在 .sn-p() 中设置地点数据
  • 如果我没记错的话,sn-p 文本显示在标记的信息窗口中,所以只有对用户有意义的东西才真正属于那里。
  • 感谢你们的回答和 cmets,他们真的帮助我理解了这个问题。我猜是这样的,但我无法弄清楚。我将尝试使用自定义标记将我的结构附加到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2014-10-19
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多