Android 在簇标记上打开 InfoWindow

2023-12-29

我实现了一个选项来查找距离实际位置最近的标记。我在带有自定义信息窗口的 ClusterItem 中拥有所有标记。在没有聚类的普通谷歌地图上我可以使用marker.showInfoWindow();然后就会弹出信息窗口。使用聚类时似乎没有这样的方法,因为标记没有添加为正确的地图标记。

My code:

public class StationsFragment extends Fragment implements OnMapReadyCallback {
    private static GoogleMap googleMap;

    private ClusterManager<MyItem> clusterManager;
    private MyItem clickedClusterItem;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.main_activity, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Utils.changeLanguage(getActivity());

        final SupportMapFragment map = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        map.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap map) {
        googleMap = map;

        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(0.0, 0.0), 10));
        map.setMyLocationEnabled(true);

        clusterManager = new ClusterManager<>(getActivity(), map);

        map.setOnCameraChangeListener(clusterManager);
        map.setOnMarkerClickListener(clusterManager);
        map.setInfoWindowAdapter(clusterManager.getMarkerManager());

        clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
            @Override
            public boolean onClusterItemClick(MyItem item) {
                clickedClusterItem = item;
                return false;
            }
        });

        loadMarkers();
    }

    private void loadMarkers() {
        clusterManager.addItem(new MyItem(lat, lng, title, snippet));
    }

    public class ItemAdapter implements GoogleMap.InfoWindowAdapter {

        private final View view;

        ItemAdapter() {
            view = getActivity().getLayoutInflater().inflate(R.layout.info_window, null);
        }

        @Override
        public View getInfoWindow(Marker marker) {
            TextView title = (TextView) view.findViewById(R.id.info_title);
            title.setText(clickedClusterItem.getTitle());

            TextView snippet = (TextView) view.findViewById(R.id.info_snippet);
            snippet.setText(clickedClusterItem.getSnippet());

            return view;
        }

        @Override
        public View getInfoContents(Marker marker) {
            return null;
        }
    }

    public class MyItem implements ClusterItem {
        private final LatLng position;
        private final String title;
        private final String snippet;

        public MyItem(double lat, double lng, String title, String snippet) {
            this.position = new LatLng(lat, lng);
            this.title = title;
            this.snippet = snippet;
        }

        @Override
        public LatLng getPosition() {
            return position;
        }

        public String getTitle(){
            return title;
        }

        public String getSnippet(){
            return snippet;
        }
    }
}

看来你没有 ClusterManager 的 clusterManager.cluster() 方法 一旦标记项添加到 clusterManager,您需要添加调用此方法

对于集群定制,请查找以下代码:

    private class CustomMapClusterRenderer<T extends ClusterItem> extends DefaultClusterRenderer<T> {
            CustomMapClusterRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
                super(context, map, clusterManager);
            }

            @Override
            protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
                //start clustering if 2 or more items overlap
                return cluster.getSize() >= Constants.MINIMUM_CLUSTER_SIZE;
            }

            @Override
            protected void onBeforeClusterItemRendered(T item,
                                                       MarkerOptions markerOptions) {
                ClusterMarkerItem markerItem = (ClusterMarkerItem) item;
                markerOptions.icon(markerItem.getmBitmapDescriptor());
            }  
            @Override
            protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) {
// for dynamically change custom map markericon
                BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.pin_cluster);
                markerOptions.icon(descriptor);
            }

            @Override
            protected void onClusterRendered(Cluster<T> cluster, Marker marker) {
                super.onClusterRendered(cluster, marker);
    //add infowindow to cluster icon
                marker.setTitle("count");
                marker.setSnippet("Total Count - " + cluster.getItems().size());
            }
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 在簇标记上打开 InfoWindow 的相关文章

随机推荐

  • Environment.CurrentDirectory 和 Directory.GetCurrentDirectory 之间有什么区别?

    在 NET 中 以下之间有什么区别 Environment CurrentDirectory Directory GetCurrentDirectory 当然 Environment CurrentDirectory是可以设置和获取的属性
  • 数组中的总和和“未定义的索引”

    我想在我的数组中求和
  • 将字符矩阵转换为数字矩阵

    我有一个 7 x 31 字符矩阵 称为extra4它的结构如下所示 gt str extra4 chr 1 7 1 31 36 88 45 48 52 46 111 31 138 45 121 09 122 62 attr dimnames
  • sql超时已过期

    日志记录 System Data SqlClient SqlException 超时已过期 这 操作完成之前超时时间已过或 服务器没有响应 我是一个初学者 当我在应用程序日志文件中看到上述错误时 这是 我看到的最常见的错误 而且每天都会重复
  • ASP.NET Web API 的 JWT 身份验证

    我试图在我的 Web API 应用程序中支持 JWT 不记名令牌 JSON Web 令牌 但我迷路了 我看到对 NET Core 和 OWIN 应用程序的支持 我目前在 IIS 中托管我的应用程序 如何在我的应用程序中实现此身份验证模块 有
  • 仅获取电子邮件文本的可靠方法,不包括以前的电子邮件

    我正在创建一个基本系统 允许用户通过电子邮件回复网站上的帖子 但是 大多数电子邮件客户端在回复电子邮件中包含之前电子邮件的文本 该文本在网站上是不需要的 有没有一种可靠的方法可以让我在不事先了解早期电子邮件的情况下仅提取新邮件 我正在使用e
  • 识别隐式强制转换和显式强制转换[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果有人能回答我的问题 我将不胜感激
  • 如何在 Spring Boot 测试中设置“headless”属性?

    我正在使用 Spring Boot 和 JavaFX 进行测试 基于一些优秀的 YouTube 视频 https www youtube com watch v hjeSOxi3uPg这解释了这一点 为了使其与TestFX https gi
  • Angular.js 子目录中的路由

    是否可以以从部署该应用程序的 Web 目录路径中抽象的方式来开发 Angular js 应用程序 我正在尝试将 Angular js 应用程序放入 Web 服务器子目录中http example com myproject http exa
  • Firestore ID 在整个数据库中是否唯一[重复]

    这个问题在这里已经有答案了 我的意思是 如果我们从所有集合和子集合等中收集所有 id 自动生成 它们都是唯一的吗 做什么的 我正在构建一个新功能 用户可以在其中共享子集合中的项目 所以我不确定 我可以在用户子集合之间使用相同的 id 吗 T
  • Laravel 雄辩关系:->latest()

    laravel中latest 的作用是什么 Example public function activity return this gt hasMany App Activity gt with user subject gt lates
  • 如何强制 PHP 使用字符串作为数组键? [复制]

    这个问题在这里已经有答案了 我遇到过一个旧应用程序 它使用 id 来命名类型数组 例如 array 1 280 gt string 3 abc 现在我需要重新排序这些 并且var dump 当键是整数时 这看起来不会发生 如果我添加一个a对
  • 使用 AcquireTokenSilent 刷新 access_token

    我有一个 asp net core MVC 应用程序 它将 access token 传递给下游 API 经过一番努力 我弄清楚了如何使用 MSAL Net 获取 access token 但访问令牌每小时都会过期 因此我必须刷新它 所以我
  • 如何从 Swift 中的 void 闭包返回值?

    我有一个函数可以查询某个用户以访问该用户的数组 我返回用户并且可以访问他们的数组 但是 该调用是异步的 返回的值为零 该函数总体上有一个完成处理程序 但是 内部有一个查询调用 并且默认情况下该查询返回 Void func getAllMat
  • Python在类中调用方法

    我在这里的表现远远超出了我的承受能力 但请耐心等待这位 Python 业余爱好者 我是一名 PHP 开发人员 之前几乎没有接触过这种语言 我想做的是调用类中的方法 听起来很简单吗 我完全困惑于 self 指的是什么 以及在类内部和类外部调用
  • 在 PHP 中将数组元素移动到新索引

    我正在寻找一个简单的函数来将数组元素移动到数组中的新位置并对索引重新排序 以便序列中没有间隙 它不需要使用关联数组 有人对此有想法吗 a array 0 gt a 1 gt c 2 gt d 3 gt b 4 gt e print r mo
  • php 中子类构造函数如何与父类构造函数交互?

    现在 我正在开发两个类用于与 MySQL 数据库交互 一个类扩展了另一个类 他们来了 class DB MySQL protected dbuser protected dbpass protected dbhost protected d
  • 在 Android 模拟器中运行时无法更改 Chrome 自定义选项卡导航栏颜色

    为 Chrome 自定义选项卡指定颜色似乎有点奇怪 您可以指定三种颜色 工具栏颜色 辅助工具栏 颜色和导航栏颜色 似乎有两种方法可以控制这些 一种是直接在 Builder 中设置这三个属性 如下所示 val builder CustomTa
  • MVC-路由,为什么我不能忽略默认值,匹配的路由不包含“控制器”路由值,这是必需的

    我有这个配置 public static void RegisterRoutes RouteCollection routes routes IgnoreRoute resource axd pathInfo routes MapRoute
  • Android 在簇标记上打开 InfoWindow

    我实现了一个选项来查找距离实际位置最近的标记 我在带有自定义信息窗口的 ClusterItem 中拥有所有标记 在没有聚类的普通谷歌地图上我可以使用marker showInfoWindow 然后就会弹出信息窗口 使用聚类时似乎没有这样的方