要求点击一个地址,直接调用百度地图,将地址显示到百度地图上,参数只有一个地址,没有对应的坐标,这就想到了以前做的地图是传送一个坐标,将该地址显示到地图上,就有了这样的思路:怎么将一个详细地址转换成坐标,然后再传送给百度地图,但是这样做好像是虽然能把详细地址转换成坐标,但是这个是在显示地址之后转换的所以就出现了空指针,具体就没再研究,觉得再换一种思路,就在网上看到了百度地图的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.csdn.net/detail/ladyweiwei1234/7129687
参考百度地图demo下载地址如下(1.3.5版本):http://download.csdn.net/detail/ladyweiwei1234/7129701