在百度地图中,搜索功能需要注意的块。
搜索到的详情需要在这里处理,如果这里传递参数,然后,在覆盖物监听事件里边取得参数需要这样放OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){
public void onGetPoiResult(PoiResult result){
//获取POI检索结果
if(result==null||result.error!= SearchResult.ERRORNO.NO_ERROR){
return;
}
for(final PoiInfo poi: result.getAllPoi()){
System.out.println(poi.name + "--" + poi.location + "--" + poi.address);
// 位置取出来坐标
latLng = poi.location;
//得到图片
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_mark4);
// 图标覆盖物的坐标图片和所在层数关联
overlayOptions = new MarkerOptions().position(latLng)
.icon(bitmap).zIndex(5);
//这个不清楚,= 号后边半句是添加覆盖物,给marker赋值就不清楚了
marker = (Marker) (mBaiduMap.addOverlay(overlayOptions));
//这里开始传递参数,需要用到bundle
Bundle bundle=new Bundle();
//这是一个实体类的实例化
bean b=new bean();
//这是把name设置到实体类里边,下边用到name,所以把它传过去
b.setName(poi.name);
//用bundle的putserializable方法把整个实体类传过去
bundle.putSerializable("info",b);
//用marker传递的
marker.setExtraInfo(bundle);
}
// 将地图移到到最后一个经纬度位置
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.setMapStatus(u);
}
public void onGetPoiDetailResult(PoiDetailResult result){
//获取Place详情页检索结果
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
};
//设置搜索功能的监听
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
这是一个按钮的事件,就是搜索用的事件search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//搜索在城市中的
/* mPoiSearch.searchInCity((new PoiCitySearchOption())
.city("北京")
.keyword("美食")
.pageNum(10));*/
//搜索左边附近的
//添加一个左边 “1”图片坐标
LatLng pt1 = new LatLng(39.93923, 116.357428);
addOverLay(pt1, R.drawable.icon_mark1);
mPoiSearch.searchNearby((new PoiNearbySearchOption())
.location(pt1)
.keyword("美食")
.radius(1000)
.pageNum(10));
}
});/**
* 添加标记在地图中
* @param point
* @param pic 图片id
*/
public void addOverLay(LatLng point,int pic) {
//定义Maker坐标点
// LatLng point = new LatLng(39.963175, 116.400244);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(pic);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap).zIndex(4);
//在地图上添加Marker,并显示
marker=(Marker) mBaiduMap.addOverlay(option);
/*这里这样写,为了让“1”图片也可以点击,如果这里不把“1”图片的信息存到里边,点击“1”图片会报错,空指针错误*/
//Bundle用于通信
Bundle bundle = new Bundle();
bean b=new bean();
b.setName("dddd");
b.setLatLng(new LatLng(39.93923, 116.357428));
bundle.putSerializable("info", b);
marker.setExtraInfo(bundle);//将bundle值传入marker中,给baiduMap设置监听时可以得到它
}
//给覆盖物添加点击事件,显示所表示的信息
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
InfoWindow mInfoWindow;
//得到上边传过来的实体类的信息
bean b= (bean) marker.getExtraInfo().get("info");
//生成一个TextView用户在地图中显示InfoWindow
TextView location = new TextView(getApplicationContext());
location.setBackgroundResource(R.drawable.icon_mark3);
location.setPadding(30, 20, 30, 50);
//去除设置实体类里边name的信息
location.setText(b.getName());
//将marker所在的经纬度的信息转化成屏幕上的坐标
final LatLng ll = marker.getPosition();
Point p = mBaiduMap.getProjection().toScreenLocation(ll);
p.y -= 47;
LatLng llInfo = mBaiduMap.getProjection().fromScreenLocation(p);
//为弹出的InfoWindow添加点击事件,0的位置本事看到别人写的是事件的但是我不知道为什么我不能写,只能写数字,数字随便写的没什么作用
mInfoWindow = new InfoWindow(location, llInfo, 0);
//显示InfoWindow
mBaiduMap.showInfoWindow(mInfoWindow);
return true;
}
});
实体类package com.example.ui_1.bmap;
import java.io.Serializable;
public class bean implements Serializable{
String name ;//店名
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
putSerializable和 getSerializable的使用()