在Activity中可以把百度地图的初始化全部放到onCreate当中,但是在fragment中需要放到两个方法中,
这是不同的生命周期决定的
一:onCreateView中完成BMapManager的初始化
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mBMapMan=new BMapManager(getActivity().getApplication());
mBMapMan.init("y80sVws3KM34fNd4xxxxx",new MKGeneralListener(){
@Override
public void onGetNetworkState(int iError) {
// TODO Auto-generated method stub
new Message().showToast(iError+"网络错误",getActivity().getApplication());
// TODO Auto-generated method stub
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
new Message().showToast("您的网络出错啦!",getActivity().getApplication());
}
}
@Override
public void onGetPermissionState(int iError) {
//new Message().showToast(iError+"验证码问题",ShipActivity.this);
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
new Message().showToast("API KEY错误, 请检查!",getActivity().getApplication());
}
if(iError == 0){
new Message().showToast("验证成功",getActivity().getApplication());
}
if(iError == 2){
new Message().showToast("请求非法",getActivity().getApplication());
}
if(iError == -300){
new Message().showToast("无法建立与服务端的连接",getActivity().getApplication());
}
if(iError == -200){
new Message().showToast("服务端数据错误,无法解析验证服务器返回数据",getActivity().getApplication());
}
if(iError == 102){
new Message().showToast("不通过白名单或者安全码不对",getActivity().getApplication());
}
}
});
return inflater.inflate(R.layout.main, container, false);
}
二:在onActivityCreated中完成后续的工作
由于在onCreateView中已经加载的布局文件,所以可以在onActivityCreated获取到布局文件相应的控件
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
//注意:请在试用setContentView前初始化BMapManager对象,否则会报错
// setContentView(R.layout.main);
mMapView=(MapView)getActivity().findViewById(R.id.bmapsView);
mMapView.setBuiltInZoomControls(true);
//设置启用内置的缩放控件
mMapController=mMapView.getController();
// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
mMapController.setCenter(point);//设置地图中心点
mMapController.setZoom(15);//设置地图zoom级别
Button button = (Button)getActivity().findViewById(R.id.but);
getActivity().findViewById(R.id.lookbut);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
new Message().showToast("点击",getActivity().getApplication());
new ProcWebSocket().connection(new Action(){
@Override
public void action(String _data) {
}
});
}});
super.onActivityCreated(savedInstanceState);
}
需要注意的是fragment中获取application需要使用getActivity().getApplication();
三:覆盖物
添加覆盖物,处理事件,移动都与在activity没有什么区别
1:自定义一个MyLocationOverlay覆盖物
public class LocationOverlay extends MyLocationOverlay{
private MapFragment sa;
public LocationOverlay(MapView arg0,MapFragment _s) {
super(arg0);
this.sa = _s;
}
@Override
protected boolean dispatchTap() { //处理覆盖物点击事件,显示出详细信息框
openPopupOverlay(this);
return super.dispatchTap();
}
/**
* 显示出详细信息框
* @param _lo
*/
public void openPopupOverlay(LocationOverlay _lo)
{
LocationData locData = _lo.getMyLocation();
PopupOverlay pop = new PopupOverlay(sa.mMapView,new PopupClickListener() {
@Override
public void onClickedPopup(int index) {
new Message().showToast("茂茂2",sa.getActivity().getApplication());
}
});
GeoPoint p2 = new GeoPoint((int) ( locData.latitude * 1E6), (int) (locData.longitude * 1E6));
//得到自定义view
View popview = LayoutInflater.from(sa.getActivity().getApplication()).inflate(
R.layout.popupoverlay, null);
//通过自定义view得到按钮并绑定事件
Button lookbut = (Button)popview.findViewById(R.id.lookbut);
lookbut.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
new Message().showToast("点击查看",sa.getActivity().getApplication());
}});
Button surebut = (Button)popview.findViewById(R.id.surebut);
surebut.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
new Message().showToast("点击确定",sa.getActivity().getApplication());
}});
pop.showPopup(popview, p2, 33);
}
/**
* 移动覆盖物
* @param _data
*/
public void moveMyLocationOverlay(String _data)
{
try
{
System.out.println(_data);
JSONObject jsonObject = new JSONObject(_data);
String jsonstrtemp = jsonObject.getString("message");
jsonObject = new JSONObject(jsonstrtemp);
float direction = (float) jsonObject.getDouble("direction");
double latitude = jsonObject.getDouble("latitude");
double longitude = jsonObject.getDouble("longitude");
LocationData locData = new LocationData();
locData.latitude =latitude;
locData.longitude = longitude;
locData.direction = direction;
this.setData(locData);
sa.mMapView.refresh();
//设置地图中心点为障碍物的新坐标,不然障碍物会更着跑出去
GeoPoint p2 = new GeoPoint((int) (latitude * 1E6), (int) (locData.longitude * 1E6));
sa.mMapController.setCenter(p2);
}
catch(Exception e)
{
new Message().showToast(e.getMessage(),sa.getActivity().getApplication());
}
}
2:在地图Fragment中加入该覆盖物
addMyLocationOverlay();
super.onActivityCreated(savedInstanceState);
private void addMyLocationOverlay()
{
myLocationOverlay = new LocationOverlay(mMapView,this);
new Message().showToast("come baby!", getActivity().getApplication());
LocationData locData = new LocationData();
//手动将位置源置为天安门
locData.latitude =39.9022; //百度纬度坐标
locData.longitude = 116.404; //百度经度坐标
locData.direction = 50.0f; // GPS定位时方向角度 round:0-360
myLocationOverlay.enableCompass();//打开指南针
myLocationOverlay.setData(locData);
mMapView.getOverlays().add(myLocationOverlay);
mMapView.refresh();
}