关闭

Android——百度地图弹出详情窗口InfoWindow

475人阅读 评论(0) 收藏 举报
分类:

百度地图点击标识点Marker,弹出详情窗InfoWindow
弹出详情窗主要要用到mBaiduMap.setOnMarkerClickListener(marker_Listener);方法
在给mBaiduMap设置setOnMarkerClickListener监听器前,要定义详情窗InfoWindow ,以及给详情窗InfoWindow 设置监听器。
这里要注意的是,定义详情窗InfoWindow时,如果是调用BitmapDescriptorFactory.fromView(infoWindow_view);方法,那么在infoWindow_view的xml布局中的根元素layout下需要有其他的UI控件做支撑,否则BitmapDescriptorFactory.fromView(infoWindow_view);方法会报空指针异常

package com.example.mapdemo02;


import java.util.ArrayList;
import java.util.List;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    MapView mMapView;//百度地图控件
    BaiduMap mBaiduMap;//地图图层


    TextView textView_findCourier;//UI显示其他标识点

    BitmapDescriptor bitmap_otherPoint;//标识点图片
    long backTime;//系统退出时间

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

    }
    @Override
    protected void onStart() {
        super.onStart();
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();


        showCourierPoint();//显示标志点
        showInfoWindow();//显示详情窗



    }
    //点击显示详情窗
    private void showInfoWindow() {
        OnMarkerClickListener marker_Listener = new OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                //在显示新信息窗之前,先关闭已经在显示的信息窗
                mBaiduMap.hideInfoWindow();
                //显示信息窗
                View infoWindow_view = getLayoutInflater().inflate(R.layout.item_infowindow, null);
                TextView textView_item_infoWindow = (TextView) infoWindow_view.findViewById(R.id.textView_item_infoWindow);
                //如果显示窗是要用自定义的view,则最外层可直接用UI控件或者layout,如果外层用layout来布局,那么布局中一定要有UI控件,否则BitmapDescriptorFactory.fromView(view);会报空指针
                //              Bundle bundle = marker.getExtraInfo();
                //              textView_item_infoWindow.setText(bundle.getString("name"));
                textView_item_infoWindow.setText("MAP");
                BitmapDescriptor infoWindow_bitmap = BitmapDescriptorFactory.fromView(infoWindow_view);
                //信息窗点击处理事件
                Log.d("tag", "infoWindow_view="+infoWindow_view);
                Log.d("tag", "infoWindow_bitmap="+infoWindow_bitmap);
                OnInfoWindowClickListener infoWindow_ClickListener = new OnInfoWindowClickListener() {

                    @Override
                    public void onInfoWindowClick() {
                        // TODO Auto-generated method stub
                        mBaiduMap.hideInfoWindow();

                    }
                };
                //定义信息窗
                InfoWindow infoWindow = new InfoWindow(infoWindow_bitmap,//信息窗布局
                        marker.getPosition(), //信息窗的点
                        100, //信息窗与点的位置关系
                        //infoWindow监听器
                        infoWindow_ClickListener
                        );
                //显示信息窗
                mBaiduMap.showInfoWindow(infoWindow);
                return true;
            }
        };
        //地图设置marker的点击事件
        mBaiduMap.setOnMarkerClickListener(marker_Listener);
    }
    //点击获取标志点的位置并显示
    private void showCourierPoint() {
        bitmap_otherPoint = BitmapDescriptorFactory.fromResource(R.drawable.point_blue);
        textView_findCourier = (TextView) findViewById(R.id.textView_findCourier);
        OnClickListener textView_findCourier_OnClickListener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                LatLng p01 = new LatLng(22.654249, 114.07256);
                LatLng p02 = new LatLng(22.614249, 114.03256);
                LatLng p03 = new LatLng(22.654249, 114.02256);
                OverlayOptions Overlay_p01 = new MarkerOptions().position(p01).icon(bitmap_otherPoint);
                OverlayOptions Overlay_p02 = new MarkerOptions().position(p02).icon(bitmap_otherPoint);
                OverlayOptions Overlay_p03 = new MarkerOptions().position(p03).icon(bitmap_otherPoint);
                lists_OverlayOptions.add(Overlay_p01);
                lists_OverlayOptions.add(Overlay_p02);
                lists_OverlayOptions.add(Overlay_p03);
                mBaiduMap.addOverlays(lists_OverlayOptions);
            }
        };
        textView_findCourier.setOnClickListener(textView_findCourier_OnClickListener);
    }

    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        mMapView.onResume();
        super.onResume();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        mMapView.onPause();
        super.onPause();
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub

        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }

    @Override
    public void onBackPressed() {
        if (System.currentTimeMillis()-backTime<2000) {
            finish();
        }else {
            backTime = System.currentTimeMillis();
            Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
        }
    }

}

详情窗的xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="80dp"
    android:layout_height="30dp"
    android:background="#00ffaa"
    >
    <TextView 
        android:id="@+id/textView_item_infoWindow"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="XXX"
        />

</RelativeLayout>

mainactivity布局xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.mapdemo02.MainActivity" >

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />

    <TextView 
        android:id="@+id/textView_findCourier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示标志点"
        android:background="#ff00aa"
        android:layout_alignParentRight="true"
        android:layout_marginTop="10dp"    
        android:layout_marginRight="5dp"   
        android:clickable="true" 
        />

</RelativeLayout>
0
0
查看评论

android百度地图 添加覆盖物Marker与InfoWindow的使用

如何添加覆盖物,实现周边搜索,以及对覆盖物的点击出现介绍等效果。 效果图: 我们的需求是,当用户点击衣食住行,或者对对附近搜索是,从服务器返回数据(经纬度,商家信息,介绍等),然后动态生成覆盖物,实现上述效果。关于图片,由于手机上的内存的有限性,所有的图片下载完成都应该存入预...
  • u011467537
  • u011467537
  • 2015-04-28 14:57
  • 1475

百度地图点聚合中marker的infowindow消失的问题

目前的业务场景是:地图中有多个点的点聚合,聚合点展开后,每个marker有自己的点击事件,点击时显示窗口信息。 做法是marker.openInfoWindow(infowin); 问题来了,每次点击时地图会自动将窗口平移到地图中心,这时窗口就消失了。 后调查发现,地图平移,缩放等操作会触发点聚合的...
  • ztop_f
  • ztop_f
  • 2017-03-22 10:17
  • 2108

(Android)百度地图API只能显示一个infowindow的完美解决方案

碰到这个问题的朋友肯定很郁闷,地图上可以添加多个mark,但是infowindow却只能显示一个,那怎样显示多个呢?换个思路,既然可以有多个mark,意味着可以添加多个图片(因为mark也是一张图片),那么我们能不能用图片的方式去显示infowindow呢? 答案是完全可以!一言不合就上图 inf...
  • u012534831
  • u012534831
  • 2016-09-23 11:57
  • 2609

百度地图开发添加覆盖物的信息时出现的问题new infoWindow的时候

新的百度地图SDK的此构造方法为四个参数的解决方法 public InfoWindow(BitmapDescriptor bd,         LatLng position,   ...
  • chenbengang
  • chenbengang
  • 2015-08-03 12:16
  • 818

百度地图创建InfoWindow自定义View显示

最近学习使用百度地图,自己做了个可以简单搜索兴趣点,设置搜索范围,搜索关键字,定位功能的应用。在使用百度地图API时发现了问题。 我想要完成的需求是:     在地图上长按然后弹出自定义的View,并且能与用户进行交互操作。 但在百度地图开发指南中关于弹出覆盖物...
  • fu755383249
  • fu755383249
  • 2015-02-02 09:20
  • 10608

关于百度地图bug之一——infowindow重影问题

最近使用infowindow,出现了重影问题,很是奇怪,因为之前也用过很多回,就这次撤了问题,苦恼了好几天,网上得到启示,说是生成view后改变其内容导致的view变化,事实证明的确如此,下面压了一个没有修改前的view,上面是修改后的view.然后我就想了一个很low的方法就是将默认的的view改...
  • BINGDUCAIJUN
  • BINGDUCAIJUN
  • 2016-03-01 09:57
  • 991

Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用

上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向,如果你还不清楚,请查看:Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器,本章会教大家如何添加覆盖物,实现周边搜索,以及对覆盖物的点击出现介绍等效果。 效果图: 我们的需求是,当用户点击衣食住行,或者...
  • lmj623565791
  • lmj623565791
  • 2014-07-13 11:39
  • 87323

百度地图InfoWindow循环显示不同的信息窗口

使用BMap.InfoWindow,在for循环展示信息的时候,总是显示最后一条信息的数据。 其实,可以将BMap.InfoWindow的创建写在一个单独的function中。这样,每一个BMap.InfoWindow,就是显示的当条的信息。   这几天在写一个开发应用中,用到...
  • q383965374
  • q383965374
  • 2014-03-27 10:59
  • 2453

百度地图覆盖物Marker与infoWindow的使用

参考博客: http://blog.csdn.net/lmj623565791/article/details/37737213对于Marker覆盖物与infoWindow的使用. 首先对于Marker的展现于infowindow的展现,需要从服务器后台中获取到 信息,包括: 经纬度,距离,商家...
  • joke124
  • joke124
  • 2015-05-23 18:01
  • 4125

百度地图 Android 设置 InfoWindow 不同缩放级别均能居中(自定义偏移量)

适用于 对InfoWindow最终相对位置需要看上去有自定义偏移的要求场景,通过设置百度地图中心的方式,适当的偏移计算,可以让InfoWindow看起来更友好 直接上代码: /** * 设置百度地图的中心 */ private void setMapCenter(La...
  • cdpsai
  • cdpsai
  • 2017-06-26 18:02
  • 644
    个人资料
    • 访问:25873次
    • 积分:487
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:2篇
    • 译文:4篇
    • 评论:1条
    文章分类
    最新评论