Android 开发百度地图之四 Poi

本文主要就百度地图上的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/////////////////////////////////////////

}

效果如下:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值