高德地图四:关键字搜索

高德地图四:关键字搜索

关键字检索介绍

根据关键字检索适用于在某个城市搜索某个名称相关的POI,例如:查找北京市的“肯德基”。

注意:关键字未设置城市信息(默认为全国搜索)时,如果涉及多个城市数据返回,仅会返回建议城市,请根据APP需求,选取城市进行搜索。

代码实现:
layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="match_parent"
			android:layout_height="match_parent"
			android:orientation="vertical" >

			<LinearLayout
				android:layout_width="fill_parent"
				android:layout_height="wrap_content"
				android:layout_margin="5.0dip" >

				<AutoCompleteTextView
					android:id="@+id/keyWord"
					android:layout_width="match_parent"
					android:layout_height="wrap_content"
					android:layout_weight="1"
					android:background="@drawable/text_search"
					android:completionThreshold="1"
					android:dropDownVerticalOffset="1.0dip"
					android:hint="请输入关键字"
					android:textColorHint="#6666"
					android:imeOptions="actionDone"
					android:inputType="text|textAutoComplete"
					android:maxLength="20"
					android:paddingRight="37.0dip"
					android:singleLine="true"
					android:textColor="#000000"
					android:textSize="16.0sp" />

				<EditText
					android:id="@+id/city"
					android:layout_width="match_parent"
					android:layout_height="wrap_content"
					android:layout_weight="1"
					android:layout_marginLeft="5.0dip"
					android:hint="请输入城市"
					android:textColorHint="#6666"
					android:text="北京"
					android:background="@drawable/text_search"
					android:imeOptions="actionDone"
					android:singleLine="true"
					android:textColor="#000000"
					android:textSize="16.0sp"/>
			</LinearLayout>

			<LinearLayout
				android:layout_width="fill_parent"
				android:layout_height="wrap_content">

				<Button
					android:id="@+id/searchButton"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:layout_weight="1"
					android:text="开始搜索" />

				<Button
					android:id="@+id/nextButton"
					android:layout_width="wrap_content"
					android:layout_height="wrap_content"
					android:layout_weight="1"
					android:text="下一页" />
			</LinearLayout>

			<fragment
				android:id="@+id/map"
				android:layout_width="match_parent"
				android:layout_height="match_parent"
				class="com.amap.api.maps.SupportMapFragment" />

		</LinearLayout>	

com/example/administrator/MainActivity.java

		package com.example.administrator;

		import android.app.ProgressDialog;
		import android.content.pm.ApplicationInfo;
		import android.content.pm.PackageInfo;
		import android.content.pm.PackageManager;
		import android.content.pm.PackageManager.NameNotFoundException;
		import android.os.Bundle;
		import android.support.v4.app.FragmentActivity;
		import android.text.Editable;
		import android.text.TextUtils;
		import android.text.TextWatcher;
		import android.view.View;
		import android.view.View.OnClickListener;
		import android.widget.AutoCompleteTextView;
		import android.widget.Button;
		import android.widget.EditText;
		import android.widget.Toast;
		import com.amap.api.maps.AMap;
		import com.amap.api.maps.AMap.InfoWindowAdapter;
		import com.amap.api.maps.AMap.OnMarkerClickListener;
		import com.amap.api.maps.AMapUtils;
		import com.amap.api.maps.SupportMapFragment;
		import com.amap.api.maps.model.Marker;
		import com.amap.api.maps.model.NaviPara;
		import com.amap.api.services.core.AMapException;
		import com.amap.api.services.core.PoiItem;
		import com.amap.api.services.core.SuggestionCity;
		import com.amap.api.services.help.Inputtips;
		import com.amap.api.services.help.Inputtips.InputtipsListener;
		import com.amap.api.services.help.InputtipsQuery;
		import com.amap.api.services.help.Tip;
		import com.amap.api.services.poisearch.PoiResult;
		import com.amap.api.services.poisearch.PoiSearch;
		import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;
		import java.util.ArrayList;
		import java.util.List;


		public class MainActivity extends FragmentActivity implements
				OnMarkerClickListener, InfoWindowAdapter, TextWatcher,
				OnPoiSearchListener, OnClickListener, InputtipsListener {
			private AMap aMap;
			private AutoCompleteTextView searchText;// 输入搜索关键字
			private String keyWord = "";// 要输入的poi搜索关键字
			private ProgressDialog progDialog = null;// 搜索时进度条
			private EditText editCity;// 要输入的城市名字或者城市区号
			private PoiResult poiResult; // poi返回的结果
			private int currentPage = 0;// 当前页面,从0开始计数
			private PoiSearch.Query query;// Poi查询条件类
			private PoiSearch poiSearch;// POI搜索

			@Override
			protected void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
				setContentView(R.layout.activity_main);
				init();
			}

			/**
			 * 初始化AMap对象
			 */
			private void init() {
				if (aMap == null) {
					aMap = ((SupportMapFragment) getSupportFragmentManager()
							.findFragmentById(R.id.map)).getMap();
					setUpMap();
				}
			}

			/**
			 * 设置页面监听
			 */
			private void setUpMap() {
				Button searButton = (Button) findViewById(R.id.searchButton);
				searButton.setOnClickListener(this);
				Button nextButton = (Button) findViewById(R.id.nextButton);
				nextButton.setOnClickListener(this);
				searchText = (AutoCompleteTextView) findViewById(R.id.keyWord);
				searchText.addTextChangedListener(this);// 添加文本输入框监听事件
				editCity = (EditText) findViewById(R.id.city);
				aMap.setOnMarkerClickListener(this);// 添加点击marker监听事件
				aMap.setInfoWindowAdapter(this);// 添加显示infowindow监听事件
			}

			/**
			 * 点击搜索按钮
			 */
			public void searchButton() {
				keyWord = searchText.getText().toString();
				if ("".equals(keyWord)) {
					Toast.makeText(this,"请输入搜索关键字",Toast.LENGTH_SHORT).show();
					return;
				} else {
					doSearchQuery();
				}
			}

			/**
			 * 点击下一页按钮
			 */
			public void nextButton() {
				if (query != null && poiSearch != null && poiResult != null) {
					if (poiResult.getPageCount() - 1 > currentPage) {
						currentPage++;
						query.setPageNum(currentPage);// 设置查后一页
						poiSearch.searchPOIAsyn();
					} else {
						Toast.makeText(this,"没找到结果",Toast.LENGTH_SHORT).show();
					}
				}
			}

			/**
			 * 显示进度框
			 */
			private void showProgressDialog() {
				if (progDialog == null)
					progDialog = new ProgressDialog(this);
				progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
				progDialog.setIndeterminate(false);
				progDialog.setCancelable(false);
				progDialog.setMessage("正在搜索:\n" + keyWord);
				progDialog.show();
			}

			/**
			 * 隐藏进度框
			 */
			private void dissmissProgressDialog() {
				if (progDialog != null) {
					progDialog.dismiss();
				}
			}

			/**
			 * 开始进行poi搜索
			 */
			protected void doSearchQuery() {
				showProgressDialog();// 显示进度框
				currentPage = 0;
				query = new PoiSearch.Query(keyWord, "", editCity.getText().toString());// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
				query.setPageSize(10);// 设置每页最多返回多少条poiitem
				query.setPageNum(currentPage);// 设置查第一页

				poiSearch = new PoiSearch(this, query);
				poiSearch.setOnPoiSearchListener(this);
				poiSearch.searchPOIAsyn();
			}

			@Override
			public boolean onMarkerClick(Marker marker) {
				marker.showInfoWindow();
				return false;
			}

			@Override
			public View getInfoContents(Marker marker) {
				return null;
			}

			@Override
			public View getInfoWindow(final Marker marker) {
		//        View view = getLayoutInflater().inflate(R.layout.poikeywordsearch_uri,
		//                null);
		//        TextView title = (TextView) view.findViewById(R.id.title);
		//        title.setText(marker.getTitle());
		//
		//        TextView snippet = (TextView) view.findViewById(R.id.snippet);
		//        snippet.setText(marker.getSnippet());
		//        ImageButton button = (ImageButton) view
		//                .findViewById(R.id.start_amap_app);
		//        // 调起高德地图app
		//        button.setOnClickListener(new OnClickListener() {
		//            @Override
		//            public void onClick(View v) {
		//                startAMapNavi(marker);
		//            }
		//        });
		//        return view;
				return null;
			}

			/**
			 * 调起高德地图导航功能,如果没安装高德地图,会进入异常,可以在异常中处理,调起高德地图app的下载页面
			 */
			public void startAMapNavi(Marker marker) {
				// 构造导航参数
				NaviPara naviPara = new NaviPara();
				// 设置终点位置
				naviPara.setTargetPoint(marker.getPosition());
				// 设置导航策略,这里是避免拥堵
				naviPara.setNaviStyle(NaviPara.DRIVING_AVOID_CONGESTION);

				// 调起高德地图导航
				try {
					AMapUtils.openAMapNavi(naviPara, getApplicationContext());
				} catch (com.amap.api.maps.AMapException e) {

					// 如果没安装会进入异常,调起下载页面
					AMapUtils.getLatestAMapApp(getApplicationContext());

				}

			}

			/**
			 * 判断高德地图app是否已经安装
			 */
			public boolean getAppIn() {
				PackageInfo packageInfo = null;
				try {
					packageInfo = this.getPackageManager().getPackageInfo(
							"com.autonavi.minimap", 0);
				} catch (NameNotFoundException e) {
					packageInfo = null;
					e.printStackTrace();
				}
				// 本手机没有安装高德地图app
				if (packageInfo != null) {
					return true;
				}
				// 本手机成功安装有高德地图app
				else {
					return false;
				}
			}

			/**
			 * 获取当前app的应用名字
			 */
			public String getApplicationName() {
				PackageManager packageManager = null;
				ApplicationInfo applicationInfo = null;
				try {
					packageManager = getApplicationContext().getPackageManager();
					applicationInfo = packageManager.getApplicationInfo(
							getPackageName(), 0);
				} catch (NameNotFoundException e) {
					applicationInfo = null;
				}
				String applicationName = (String) packageManager
						.getApplicationLabel(applicationInfo);
				return applicationName;
			}

			/**
			 * poi没有搜索到数据,返回一些推荐城市的信息
			 */
			private void showSuggestCity(List<SuggestionCity> cities) {
				String infomation = "推荐城市\n";
				for (int i = 0; i < cities.size(); i++) {
					infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"
							+ cities.get(i).getCityCode() + "城市编码:"
							+ cities.get(i).getAdCode() + "\n";
				}
				Toast.makeText(this,infomation,Toast.LENGTH_SHORT).show();
			}

			@Override
			public void afterTextChanged(Editable s) {

			}

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
										  int after) {

			}

			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				String newText = s.toString().trim();
				if (!TextUtils.isEmpty(newText)) {
					InputtipsQuery inputquery = new InputtipsQuery(newText, editCity.getText().toString());
					Inputtips inputTips = new Inputtips(this, inputquery);
					inputTips.setInputtipsListener(this);
					inputTips.requestInputtipsAsyn();
				}
			}


			/**

			 * POI信息查询回调方法
			 */
			@Override
			public void onPoiSearched(PoiResult result, int rCode) {
				dissmissProgressDialog();// 隐藏对话框
				if (rCode == AMapException.CODE_AMAP_SUCCESS) {
					if (result != null && result.getQuery() != null) {// 搜索poi的结果
						if (result.getQuery().equals(query)) {// 是否是同一条
							poiResult = result;
							// 取得搜索到的poiitems有多少页
							List<PoiItem> poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
							List<SuggestionCity> suggestionCities = poiResult
									.getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息

							if (poiItems != null && poiItems.size() > 0) {
								aMap.clear();// 清理之前的图标
								PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems);
								poiOverlay.removeFromMap();
								poiOverlay.addToMap();
								poiOverlay.zoomToSpan();
							} else if (suggestionCities != null
									&& suggestionCities.size() > 0) {
								showSuggestCity(suggestionCities);
							} else {
								Toast.makeText(this,"没找到结果",Toast.LENGTH_SHORT).show();
							}
						}
					} else {
						Toast.makeText(this,"没找到结果2",Toast.LENGTH_SHORT).show();
					}
				} else {
					Toast.makeText(this,"没找到结果3",Toast.LENGTH_SHORT).show();
				}

			}

			@Override
			public void onPoiItemSearched(PoiItem item, int rCode) {
				// TODO Auto-generated method stub

			}

			/**
			 * Button点击事件回调方法
			 */
			@Override
			public void onClick(View v) {
				switch (v.getId()) {
					/**
					 * 点击搜索按钮
					 */
					case R.id.searchButton:
						searchButton();
						break;
					/**
					 * 点击下一页按钮
					 */
					case R.id.nextButton:
						nextButton();
						break;
					default:
						break;
				}
			}



			@Override
			public void onGetInputtips(List<Tip> tipList, int rCode) {
				if (rCode == AMapException.CODE_AMAP_SUCCESS) {// 正确返回
					List<String> listString = new ArrayList<String>();
					for (int i = 0; i < tipList.size(); i++) {
						listString.add(tipList.get(i).getName());
					}
		//            ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(
		//                    getApplicationContext(),
		//                    R.layout.route_inputs, listString);
		//            searchText.setAdapter(aAdapter);
		//            aAdapter.notifyDataSetChanged();
				} else {
		//            ToastUtil.showerror(this, rCode);
				}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值