要求点击一个地址,直接调用百度地图,将地址显示到百度地图上,参数只有一个地址,没有对应的坐标,这就想到了以前做的地图是传送一个坐标,将该地址显示到地图上,就有了这样的思路:怎么将一个详细地址转换成坐标,然后再传送给百度地图,但是这样做好像是虽然能把详细地址转换成坐标,但是这个是在显示地址之后转换的所以就出现了空指针,具体就没再研究,觉得再换一种思路,就在网上看到了百度地图的api上面有一个输入地址点击搜索就会在将该地址显示到了地图上,觉得这个应该就可以,于是好好看了一下百度demo中的GeoCoder这个java文件,这个就是输入一个地址,点击搜索按钮直接显示将地址显示在地图上的,点击搜索是调用的MKSearch的geocode("详细地址","具体城市"),然后我就在我的调用地图的那个界面 初始化地图之后就调用了这个方法,点击进入之后,就一直在加载,显示不出来位置,我这里跟他的唯一区别就是百度地图demo是点击触发这个事件,而我是初始化地图后就调用该方法。但是这是为什么呢,我的为什么一直就加载中,但是不显示呢。
一下代码是百度地图demo的代码
// 初始化搜索模块,注册事件监听
mSearch = new MKSearch();
mSearch.init(app.mBMapMan, new MKSearchListener() {
@Override
public void onGetPoiDetailSearchResult(int type, int error) {
}
public void onGetAddrResult(MKAddrInfo res, int error) {
if (error != 0) {
String str = String.format("错误号:%d", error);
Toast.makeText(GeoCoder.this, str, Toast.LENGTH_LONG).show();
return;
}
mMapView.getController().animateTo(res.geoPt);
String strInfo = String.format("纬度:%f 经度:%f\r\n", res.geoPt.getLatitudeE6()/1e6,
res.geoPt.getLongitudeE6()/1e6);
Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
Drawable marker = getResources().getDrawable(R.drawable.iconmarka); //得到需要标在地图上的资源
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker
.getIntrinsicHeight()); //为maker定义位置和边界
mMapView.getOverlays().clear();
mMapView.getOverlays().add(new OverItemT(marker, GeoCoder.this, res.geoPt, res.strAddr));
}
public void onGetPoiResult(MKPoiResult res, int type, int error) {
if (error != 0 || res == null) {
Toast.makeText(GeoCoder.this, "解析失败", Toast.LENGTH_LONG).show();
return;
}
if (res != null && res.getCurrentNumPois() > 0) {
GeoPoint ptGeo = res.getAllPoi().get(0).pt;
// 移动地图到该点:
mMapView.getController().animateTo(ptGeo);
String strInfo = String.format("纬度:%f 经度:%f\r\n", ptGeo.getLatitudeE6()/1e6,
ptGeo.getLongitudeE6()/1e6);
strInfo += "\r\n附近有:";
for (int i = 0; i < res.getAllPoi().size(); i++) {
strInfo += (res.getAllPoi().get(i).name + ";");
}
Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
}
}
public void onGetDrivingRouteResult(MKDrivingRouteResult res,
int error) {
}
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
}
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
}
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
}
@Override
public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGetRGCShareUrlResult(String arg0, int arg1) {
// TODO Auto-generated method stub
}
});
EditText editCity = (EditText)findViewById(R.id.city);
EditText editGeoCodeKey = (EditText)findViewById(R.id.geocodekey);
mSearch.geocode(editGeoCodeKey.getText().toString(), editCity.getText().toString());
后来网友就说该方法是被动的方法,要主动调用,建议用一个线程去调用,我就在初始化地图之后,写了一个线程,在线程里调用MKSearch的geocode("详细地址","具体城市")方法,果然加载成功了。但是有一个问题是,我必须的点击一下屏幕,地图才刷新,有开始在网上搜,说是把AndroidMainfest.xml文件中的androidmanifest <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />的android:targetSdkVersion="10"去掉就可以了,果然成功了!
在说一下,这个是成功了,但是还有一个问题,让地址显示到地图上之后,还想弹出一个详细地址,一直放到地图上,现在是可以将地标放到地图上,如下代码,该代码写到监听事件中MKSearchListener()
Drawable marker = getResources().getDrawable(R.drawable.point_start); //得到需要标在地图上的资源
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker
.getIntrinsicHeight()); //为maker定义位置和边界
View mPopView = getLayoutInflater().inflate(R.layout.popview2, null);
OverItemT overItemT = new OverItemT(marker, LocationActivity.this, res.geoPt, res.strAddr);
但是我想弹出个详细地址的泡泡,这该怎么做呢,百度地图demo中还有一个ItemizedOverlayDemo这个Java类是可以显示泡泡的,但是这个是点击地标之后会弹出泡泡,如下代码如下
// 处理当点击事件
protected boolean onTap(int i) {
setFocus(mGeoList.get(i));
// 更新气泡位置,并使之显示
GeoPoint pt = mGeoList.get(i).getPoint();
ItemizedOverlayDemo.mMapView.updateViewLayout( ItemizedOverlayDemo.mPopView,
new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
pt, MapView.LayoutParams.BOTTOM_CENTER));
ItemizedOverlayDemo.mPopView.setVisibility(View.VISIBLE);
Toast.makeText(this.mContext, mGeoList.get(i).getSnippet(),
Toast.LENGTH_SHORT).show();
return true;
}
哈哈,我把改代码写到了
我把以上代码写到了MKSearchListener()这个监听事件里,但是这时会报错,原来是因为我没有将弹出气泡添加到地图里就update了,应该在MKSearchListener()这个监听事件加上如下代码
// 创建点击mark时的弹出泡泡
mPopView=super.getLayoutInflater().inflate(R.layout.popview, null);
mMapView.addView( mPopView,
new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
null, MapView.LayoutParams.TOP_LEFT));
mPopView.setVisibility(View.GONE);
加上代码之后就可以在地标的图片位置有弹出的详细地址泡泡了,但是这时候就是弹出的泡泡跟地标图片重叠了,刚开始我想在update处改一下泡泡的位置,但是这个不是简单的
point,所以后来我想到了修改泡泡的layout文件,哈哈,最后就成功了。
代码下载地址如下:http://download.youkuaiyun.com/detail/ladyweiwei1234/7129687
参考百度地图demo下载地址如下(1.3.5版本):http://download.youkuaiyun.com/detail/ladyweiwei1234/7129701