【问题标题】:How to open a Infowindow on every marker (multiple marker) in android?如何在android中的每个标记(多个标记)上打开一个信息窗口?
【发布时间】:2017-07-15 09:49:45
【问题描述】:

由于我使用的是 Google 地图 v2,并且我想打开多个制造商的信息窗口。我用单个标记完成了这个,还使用了 show info window();但它适用于最后一个标记且仅适用于一个。 我只想要且仅在 android 中。

public class MainActivity extends FragmentActivity {

    private GoogleMap googleMap;
    private final LatLng HAMBURG = new LatLng(53.558, 9.927);
    private final LatLng KIEL = new LatLng(53.551, 9.993);
    private Marker marker;
    private Hashtable<String, String> markers;
    private ImageLoader imageLoader;
    private DisplayImageOptions options;

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

        googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();

        initImageLoader();
        markers = new Hashtable<String, String>();
        imageLoader = ImageLoader.getInstance();

        options = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.ic_launcher)      //  Display Stub Image
            .showImageForEmptyUri(R.drawable.ic_launcher)   //  If Empty image found
            .cacheInMemory()
            .cacheOnDisc().bitmapConfig(Bitmap.Config.RGB_565).build();

        if ( googleMap != null ) {

            googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());

            final Marker hamburg = googleMap.addMarker(new MarkerOptions().position(HAMBURG)
                        .title("Hamburg"));
            hamburg.showInfoWindow();
            markers.put(hamburg.getId(), "http://img.india-forums.com/images/100x100/37525-a-still-image-of-akshay-kumar.jpg");

            final Marker kiel = googleMap.addMarker(new MarkerOptions()
                        .position(KIEL)
                        .title("Kiel")
                        .snippet("Kiel is cool")
                        .icon(BitmapDescriptorFactory
                            .fromResource(R.drawable.ic_launcher)));
            markers.put(kiel.getId(), "http://www.yodot.com/images/jpeg-images-sm.png");
            //kiel.showInfoWindow();

            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
        }
    }

    private class CustomInfoWindowAdapter implements InfoWindowAdapter {

        private View view;

        public CustomInfoWindowAdapter() {
            view = getLayoutInflater().inflate(R.layout.custom_info_window,
                    null);
        }

        @Override
        public View getInfoContents(Marker marker) {

            if (MainActivity.this.marker != null
                    && MainActivity.this.marker.isInfoWindowShown()) {
                MainActivity.this.marker.hideInfoWindow();
                MainActivity.this.marker.showInfoWindow();
            }
            return null;
        }

        @Override
        public View getInfoWindow(final Marker marker) {
            MainActivity.this.marker = marker;

            String url = null;

            if (marker.getId() != null && markers != null && markers.size() > 0) {
                if ( markers.get(marker.getId()) != null &&
                        markers.get(marker.getId()) != null) {
                    url = markers.get(marker.getId());
                }
            }
            final ImageView image = ((ImageView) view.findViewById(R.id.badge));

            if (url != null && !url.equalsIgnoreCase("null")
                    && !url.equalsIgnoreCase("")) {
                imageLoader.displayImage(url, image, options,
                        new SimpleImageLoadingListener() {
                            @Override
                            public void onLoadingComplete(String imageUri,
                                    View view, Bitmap loadedImage) {
                                super.onLoadingComplete(imageUri, view,
                                        loadedImage);
                                getInfoContents(marker);
                            }
                        });
            } else {
                image.setImageResource(R.drawable.ic_launcher);
            }

            final String title = marker.getTitle();
            final TextView titleUi = ((TextView) view.findViewById(R.id.title));
            if (title != null) {
                titleUi.setText(title);
            } else {
                titleUi.setText("");
            }

            final String snippet = marker.getSnippet();
            final TextView snippetUi = ((TextView) view
                    .findViewById(R.id.snippet));
            if (snippet != null) {
                snippetUi.setText(snippet);
            } else {
                snippetUi.setText("");
            }

            return view;
        }
    }

    private void initImageLoader() {
        int memoryCacheSize;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
            int memClass = ((ActivityManager) 
                    getSystemService(Context.ACTIVITY_SERVICE))
                    .getMemoryClass();
            memoryCacheSize = (memClass / 8) * 1024 * 1024;
        } else {
            memoryCacheSize = 2 * 1024 * 1024;
        }

        final ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                this).threadPoolSize(5)
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .memoryCacheSize(memoryCacheSize)
                .memoryCache(new FIFOLimitedMemoryCache(memoryCacheSize-1000000))
                .denyCacheImageMultipleSizesInMemory()
                .discCacheFileNameGenerator(new Md5FileNameGenerator())
                .tasksProcessingOrder(QueueProcessingType.LIFO).enableLogging() 
                .build();

        ImageLoader.getInstance().init(config);
    }
}

【问题讨论】:

  • 您说要添加多个标记。发布添加标记代码
  • 我想在两个标记上显示信息窗口。这是我为两个标记做的演示

标签: android


【解决方案1】:

默认标记一次只能显示一个信息窗口。但是,您可以使用 Maps Android 库轻松显示更多内容:https://developers.google.com/maps/documentation/android-api/utility/

这是一个例子:

IconGenerator iconFactory = new IconGenerator(this);
mMarkerA = mMap.addMarker(new MarkerOptions().position(new LatLng(12, 34)));
mMarkerA.setIcon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon("Marker A")));
mMarkerB = mMap.addMarker(new MarkerOptions().position(new LatLng(13, 35)));
mMarkerB.setIcon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon("Marker B")));

并添加

compile 'com.google.maps.android:android-maps-utils:0.4+'

到你的 gradle 文件。

【讨论】:

    【解决方案2】:

    根据谷歌地图 Android v2

    信息窗口允许您在用户点击地图上的标记时向他们显示信息。默认情况下,如果标记设置了标题,则当用户点击标记时会显示信息窗口。一次只显示一个信息窗口。如果用户点击另一个标记,当前窗口将被隐藏并显示新的信息窗口。您可以通过在目标标记上调用 showInfoWindow() 以编程方式显示信息窗口。可以通过调用 hideInfoWindow() 来隐藏信息窗口

    喜欢:

     LatLng latlang = new LatLng(lati, longi);
        if (map != null) {
        Marker marker = map.addMarker(new MarkerOptions()
        .position(latlang)
        .title(getResources().getString(R.string.titleProduct))
        .snippet(getResources().getString(R.string.contentProduct))
        .icon(BitmapDescriptorFactory
        .fromResource(R.drawable.map_pointer)));
         marker.showInfoWindow();
    
    }
    

    并用尽可能多的地图指针重复此操作。

    【讨论】:

    • 当第二个 InfoWindow 显示时,它将隐藏第一个,依此类推。
    【解决方案3】:

    首先评论这一行。

    googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());
    

    然后使用此代码在地图上添加标记

    Marker marker = googleMap.addMarker(new MarkerOptions()
                     .position(HAMBURG)
                     .title("Hamburg")
                     .snippet("welcome to Map")
                     .icon(BitmapDescriptorFactory.fromResource(R.drawable.start_pin)).draggable(false));
      googleMap.addMarker(new MarkerOptions()
                     .position(KIEL)
                     .title("KIEL")
                     .snippet("welcome to Map")
                     .icon(BitmapDescriptorFactory.fromResource(R.drawable.start_pin)).draggable(false));
    
    marker.showInfoWindow();
    

    然后注释其他代码并执行一次。然后我会给CustomAdapter代码

    【讨论】:

    • 我认为在 Android 中一次只会显示一个信息窗口。单击第一个标记时,它将显示标题为“汉堡”,当您单击第二个标记时,第一个标记信息窗口将被关闭,第二个标记信息窗口将显示标题“KIEL”检查一次并更新我
    • 是的,我已经这样做了...它显示了标记的点击...但是我希望两个标记都会在地图自动打开时显示信息窗口....不是点击
    • 您可以使用 marker.showInfoWindow() 方法显示标记的信息窗口。但我认为它只会显示一个信息窗口
    • 是的,亲爱的,我已经写了这个,我使用了这个并且它只在一个标记上工作:-(
    • 正如我所说,我们一次只能显示一个信息窗口。一旦检查这个问题stackoverflow.com/questions/15899619/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多