本文主要就百度地图上的POI 功能做个讲解,本次主要是以上海市内搜索相关地区的例子。
首先是在前面百度开发系列的demo 中添加两个搜索框来搜索起始地址。代码如下:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_baidumap_start"/>
<TextView
android:id="@+id/tv_start_pos"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="起点"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_baidumap_destination"/>
<TextView
android:id="@+id/tv_end_pos"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="終点"/>
</LinearLayout>
- 在java主文文件中添加触发监听,当点击搜索框是从下面蹦出一个Dialog 来搜索。
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.tv_start_pos: {
ChoosePosDlg.DlgListener listener = new ChoosePosDlg.DlgListener() {
@Override
public void choosePossuccess(MapPosition mapPosition) {
mStartPosition=mapPosition;
mTxtStartPos.setText(mapPosition.getName());
}
};
ChoosePosDlg.registerListener(listener);
new ChoosePosDlg(this, R.style.bottom_animation_dlg,mCity).show();
}
break;
case R.id.tv_end_pos: {
ChoosePosDlg.DlgListener listener = new ChoosePosDlg.DlgListener() {
@Override
public void choosePossuccess(MapPosition mapPosition) {
mEndPosition=mapPosition;
mTxtEndPos.setText(mapPosition.getName());
}
};
ChoosePosDlg.registerListener(listener);
new ChoosePosDlg(this, R.style.bottom_animation_dlg,mCity).show();
}
}
}
- 最后在编写 Dialog,其中主要的poi 代码块是:
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(mCity)
.keyword(addr.trim())
.pageNum(0).pageCapacity(15)); //调用poi查询
监听查询的结果:
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
if (TextUtils.isEmpty(mAddrEditText.getText().toString().trim())) {
return;
}
mMapPositionList.clear();
for (int i = 0; i < poiResult.getAllPoi().size(); i++) {
try {
MapPosition mp = new MapPosition();
if (poiResult.getAllPoi().get(i).type == PoiInfo.POITYPE.BUS_STATION) {
mp.setAddress(poiResult.getAllPoi().get(i).city + "(" +
poiResult.getAllPoi().get(i).name + "公交车站)");
} else {
mp.setAddress(poiResult.getAllPoi().get(i).address);
}
mp.setName(poiResult.getAllPoi().get(i).name);
mp.setLatitude(poiResult.getAllPoi().get(i).location.latitude + "");
mp.setLongitude(poiResult.getAllPoi().get(i).location.longitude + "");
mMapPositionList.add(mp);
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
mRootListAdapter.notifyDataSetChanged();
} else {
mMapPosition.clearPos();
}
}
完整的ChoosePosDlg 的代码如下:
public class ChoosePosDlg extends Dialog implements OnGetPoiSearchResultListener {
private final Context mContext;
private PoiSearch mPoiSearch;
private String mCity;
private EditText mAddrEditText;
private ListView mListView;
private MapPosition mMapPosition;
private ArrayList<MapPosition> mMapPositionList;
private ChoosePosAdapter mRootListAdapter;
public ChoosePosDlg(Context context, int themeResId,String city) {
super(context, themeResId);
mContext=context;
mCity = city;
}
private static DlgListener mListener;
public static interface DlgListener {
public void choosePossuccess(MapPosition mapPosition);
}
public static void registerListener(DlgListener listener) {
mListener = listener;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_choose_pos);
setCancelable(true);
mPoiSearch = PoiSearch.newInstance();
mPoiSearch.setOnGetPoiSearchResultListener(this);
initView();
setViews();
setListeners();
mAddrEditText.requestFocus();
}
@Override
public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
initListener();
DisplayMetrics dm = new DisplayMetrics();
((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenHeight = dm.heightPixels;
Window window = this.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.x = 0;//设置x坐标
params.y = (screenHeight) / 2;//设置y坐标
window.setAttributes(params);
}
private void initListener() {
setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent arg2) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
dismiss();
return true;
}
return false;
}
});
setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
mPoiSearch.destroy();
}
});
}
protected void initView() {
mAddrEditText = (EditText) findViewById(R.id.et_addr);
mListView = (ListView) findViewById(R.id.lv_result);
}
protected void setViews() {
mAddrEditText.setHint("输入地址");
mMapPosition = new MapPosition();
mMapPositionList = new ArrayList<MapPosition>();
// mMapPositionList.addAll(defaultPositionList);
mRootListAdapter = new ChoosePosAdapter(mContext, mMapPositionList);
mListView.setAdapter(mRootListAdapter);
}
/////////////////////////////////////setListeners////////////////////////////////////////
private void setListeners() {
mAddrEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
String addr = mAddrEditText.getText().toString().trim();
if (!TextUtils.isEmpty(addr)) {
if (!TextUtils.isEmpty(mCity)) {
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(mCity)
.keyword(addr.trim())
.pageNum(0).pageCapacity(15));
}
}
}
}
});
//////////////////////////////////////////////////////////////////////////////////
mAddrEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void afterTextChanged(Editable editable) {
String addr = mAddrEditText.getText().toString().trim();
if (!TextUtils.isEmpty(addr)) {
if (!TextUtils.isEmpty(mCity)) {
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(mCity)
.keyword(addr.trim())
.pageNum(0).pageCapacity(15));
}
}
////
}
});
//////////////////////////////////////////////////////////////////////////////////
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (null == mListener) {
dismiss();
return;
}
mMapPosition = mMapPositionList.get(i);
if (TextUtils.isEmpty(mMapPosition.getName())) {
Toast.makeText(mContext, "请输入正确的位置", Toast.LENGTH_SHORT).show();
} else {
if (null != mListener)
mListener.choosePossuccess(mMapPosition);
dismiss();
}
}
});
}
//////////////////////////poi/////////////////////////////////////////
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
if (TextUtils.isEmpty(mAddrEditText.getText().toString().trim())) {
return;
}
mMapPositionList.clear();
for (int i = 0; i < poiResult.getAllPoi().size(); i++) {
try {
MapPosition mp = new MapPosition();
if (poiResult.getAllPoi().get(i).type == PoiInfo.POITYPE.BUS_STATION) {
mp.setAddress(poiResult.getAllPoi().get(i).city + "(" +
poiResult.getAllPoi().get(i).name + "公交车站)");
} else {
mp.setAddress(poiResult.getAllPoi().get(i).address);
}
mp.setName(poiResult.getAllPoi().get(i).name);
mp.setLatitude(poiResult.getAllPoi().get(i).location.latitude + "");
mp.setLongitude(poiResult.getAllPoi().get(i).location.longitude + "");
mMapPositionList.add(mp);
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
mRootListAdapter.notifyDataSetChanged();
} else {
mMapPosition.clearPos();
}
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
//////////////////////////poi/////////////////////////////////////////
}
效果如下: