Android高德地图使用之地点关键词的输入提示-InputTips
2017-03-13 11:16
561 查看
这几天在写android高德地图相关的项目,遇到实现乘客选择上下车地点的功能,其中涉及到搜索界面中文本框的地点输入的自动提示模块,先来看下滴滴上该功能的效果图:
从图中分析并划分一下简单功能需求:
1).主界面的定位功能
2).主界面点击目的地的TextView跳转到搜索目的地的界面
3).搜索界面文本框前面显示当前所在城市,也就是当前的定位信息
4).文本框的输入后自动提示
简单来说,就这些功能,那么我们来逐一实现一下吧:
1.主界面的定位功能
这一块比较简单,高德地图官网给出了具体实现,网上也有很多相关文章,这里就直接跳过了,想省事的可以看看这篇文章:http://blog.csdn.net/jwzhangjie/article/details/43151045
2.主界面点击选择目的地跳转到搜索界面,并在搜索界面显示城市信息
二和三两个功能模块我就连起来讲了,因为这里简单涉及到两个activity之间的数据传递,主要用intent这个意图来实现,这里就贴上关键代码吧:
(1).发送城市数据:
(2).接收城市数据:
3.文本框的输入后自动提示
到了功能的重点了,来分析一下实现思路:
(1).输入的自动提示文本框
(2).获取地理信息的数据并传入,并且对当前城市筛选搜索信息
(3).将信息显示出来
实现步骤:
1).android为我们提供了自动提示文本框来实现输入关键字为其匹配相关的信息条目
用法:http://www.cnblogs.com/tinyphp/p/3969984.html参考一下这篇文章
注意它可以通过设置adapter来实现查询匹配信息的下拉列表
我们主要是通过将自定义的listview来显示信息条目,在其ontextchange()中监听
2).至于获取地理信息和相关具体搜索筛选的庞大工作量肯定不需要我们自己完成,高德地图已经为我们提供了一系列的封装方法和接口:
我们去官网查看一下高德开发文档:
发现它为我们提供三个类和一个接口,先看下这个接口:
我们可以看到,这里面只为我们提供了一个方法:
从图中分析并划分一下简单功能需求:
1).主界面的定位功能
2).主界面点击目的地的TextView跳转到搜索目的地的界面
3).搜索界面文本框前面显示当前所在城市,也就是当前的定位信息
4).文本框的输入后自动提示
简单来说,就这些功能,那么我们来逐一实现一下吧:
1.主界面的定位功能
这一块比较简单,高德地图官网给出了具体实现,网上也有很多相关文章,这里就直接跳过了,想省事的可以看看这篇文章:http://blog.csdn.net/jwzhangjie/article/details/43151045
2.主界面点击选择目的地跳转到搜索界面,并在搜索界面显示城市信息
二和三两个功能模块我就连起来讲了,因为这里简单涉及到两个activity之间的数据传递,主要用intent这个意图来实现,这里就贴上关键代码吧:
(1).发送城市数据:
searchPlace=amapLocation.getCity();//获取所在城市信息
case R.id.drop_off: //poi搜索界面的跳转 Intent intent_search=new Intent(MainMenuActivity.this, POISearchActivity.class); intent_search.putExtra("city",searchPlace);//将定位的城市信息传入poi搜索事件处理 startActivity(intent_search); break;
(2).接收城市数据:
public String sendCityInfo(){//将前面定位数据中的city数据传过来 String info;//前面定位所在城市信息 Intent intent=this.getIntent(); info=intent.getStringExtra("city"); return info; }
TextView city_tv;//显示当前定位城市信息的tv
city_tv= (TextView) findViewById(R.id.locate_city);
city_tv.setText(sendCityInfo());//设置tv显示的城市信息
3.文本框的输入后自动提示
到了功能的重点了,来分析一下实现思路:
(1).输入的自动提示文本框
(2).获取地理信息的数据并传入,并且对当前城市筛选搜索信息
(3).将信息显示出来
实现步骤:
1).android为我们提供了自动提示文本框来实现输入关键字为其匹配相关的信息条目
用法:http://www.cnblogs.com/tinyphp/p/3969984.html参考一下这篇文章
注意它可以通过设置adapter来实现查询匹配信息的下拉列表
我们主要是通过将自定义的listview来显示信息条目,在其ontextchange()中监听
2).至于获取地理信息和相关具体搜索筛选的庞大工作量肯定不需要我们自己完成,高德地图已经为我们提供了一系列的封装方法和接口:
我们去官网查看一下高德开发文档:
发现它为我们提供三个类和一个接口,先看下这个接口:
我们可以看到,这里面只为我们提供了一个方法:
void onGetInputtips(java.util.List<Tip> inputTips, int resultID)
后面说的很清楚,它是用来输入提示回调时调用的方法,注意一下它的参数,第一个是Tip类,它是干嘛用的呢?我们点进去看一下这个类:
它为我们提供了很多信息:主要是一些地理信息(经纬度,区域编码,详细地址信息等)
那么我们可以断定,这个list就是我们需要的地理数据。
(3).显示匹配到的数据
这里我是通过自己定义的SearchAdapter为下面的listview适配数据来实现的,字条目数据是一个List<HashMap<String,String>>类型,键值对的key为“name”,其对应的就是地址名的信息,然后用list将其存储并在listview上显示
说那么多,还是看下功能代码吧:
首先是适配器:
/** * Created by Administrator on 2017/3/10. * 搜索显示列表的数据适配器类 */ public class SearchAdapter extends BaseAdapter { private List<HashMap<String,String>> addressData; private LayoutInflater layoutInflater; public SearchAdapter(Context context) { layoutInflater=LayoutInflater.from(context); addressData=new ArrayList<HashMap<String, String>>() ; } @Override public int getCount() { return addressData.size(); } @Override public Object getItem(int position) { return addressData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh = null; if(convertView == null){ vh = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.search_list_item, null); vh.title = (TextView) convertView.findViewById(R.id.search_item_title); vh.text = (TextView) convertView.findViewById(R.id.search_item_text); convertView.setTag(vh); }else{ vh = (ViewHolder) convertView.getTag(); } vh.title.setText(addressData.get(position).get("name")); vh.text.setText(addressData.get(position).get("address")); return convertView; } }然后是activity中的自动输入的实现代码:
@Override关键代码部分都注释了,理解起来不难,如果对于其中方法和用法不熟悉,可以参考官方的开发参考手册和官方的实例。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_poisearch);
search_edittext= (AutoCompleteTextView) findViewById(R.id.search_edit);
search_list= (ListView) findViewById(R.id.search_list);
city_tv= (TextView) findViewById(R.id.locate_city);
search_for_place= (TextView) findViewById(R.id.search_for_place);
search_edittext.addTextChangedListener(this);
search_list.setOnItemClickListener(this);
search_for_place.setOnClickListener(this);
city_tv.setText(sendCityInfo());//设置tv显示的城市信息
city=sendCityInfo();//将前面的定位城市信息传入作为搜索参数
}
public String sendCityInfo(){//将前面定位数据中的city数据传过来 String info;//前面定位所在城市信息 Intent intent=this.getIntent(); info=intent.getStringExtra("city"); return info; }
@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 content=s.toString().trim();//获取自动提示输入框的内容
InputtipsQuery inputtipsQuery=new InputtipsQuery(content,city);//初始化一个输入提示搜索对象,并传入参数
inputtipsQuery.setCityLimit(true);//将获取到的结果进行城市限制筛选
Inputtips inputtips=new Inputtips(this,inputtipsQuery);//定义一个输入提示对象,传入当前上下文和搜索对象
inputtips.setInputtipsListener(this);//设置输入提示查询的监听,实现输入提示的监听方法onGetInputtips()
inputtips.requestInputtipsAsyn();//输入查询提示的异步接口实现
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// PositionEntity entity = (PositionEntity) searchAdapter.getItem(position);
// if (entity.latitue == 0 && entity.longitude == 0) {
// PoiSearchTask poiSearchTask=new PoiSearchTask(getApplicationContext(), searchAdapter);
// poiSearchTask.search(entity.address,RouteTask.getInstance(getApplicationContext()).getStartPoint().city);
//
// } else {
//// mRouteTask.setEndPoint(entity);
//// mRouteTask.search();
// Intent intent = new Intent(POISearchActivity.this, MainMenuActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
// startActivity(intent);
// finish();
// }
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.search_for_place:
PoiSearchTask poiSearchTask=new PoiSearchTask(getApplicationContext(), searchAdapter);
poiSearchTask.search(search_edittext.getText().toString(),RouteTask.getInstance(getApplicationContext()).getStartPoint().city);
break;
}
}
@Override
/*
输入提示的回调方法
参数1:提示列表
参数2:返回码
*/
public void onGetInputtips(List<Tip> list, int returnCode) {
if(returnCode== AMapException.CODE_AMAP_SUCCESS){//如果输入提示搜索成功
List<HashMap<String,String>> searchList=new ArrayList<HashMap<String, String>>() ;
for (int i=0;i<list.size();i++){
HashMap<String,String> hashMap=new HashMap<String, String>();
hashMap.put("name",list.get(i).getName());
hashMap.put("address",list.get(i).getDistrict());//将地址信息取出放入HashMap中
searchList.add(hashMap);//将HashMap放入表中
}
searchAdapter=new SearchAdapter(this);//新建一个适配器
search_list.setAdapter(searchAdapter);//为listview适配
SimpleAdapter aAdapter = new SimpleAdapter(getApplicationContext(), searchList, R.layout.search_list_item,
new String[] {"name","address"}, new int[] {R.id.search_item_title, R.id.search_item_text});
search_list.setAdapter(aAdapter);
aAdapter.notifyDataSetChanged();//动态更新listview
}else{
ToastUtil.show(this,returnCode);
}
}
来看一下最后我们的实现效果吧:
是简单了点,不过基本需求是达到了。
本文仅作记录,有不足和改进指出请提出,如要转载请附上文章原址,谢谢。
相关文章推荐
- Android高德地图的使用,狠详细!手把手!(地图+定位+逆地理编码+输入提示+Poi搜索)
- android使用输入过滤器InputFilter约束用户输入
- Android高德地图的使用及附近地点POISearch列表展示
- Android平台上面输入法遮挡问题-android:windowSoftInputMode属性使用
- 使用Appium做手机app自动化时,红米2手机(已ROOT)时不时的弹出覆盖安装Appium Android Input Manager for Unicode的输入法的提示的解决办法
- Android基于高德地图实现搜索框的自动输入提示功能
- android使用输入过滤器InputFilter约束用户输入
- Android 5.0新控件 TextInputLayout | 文字输入布局 介绍及使用详情
- Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
- android消息提示控件badgeview使用tips
- Android平台上面输入法遮挡问题-android:windowSoftInputMode属性使用
- android使用输入过滤器InputFilter约束用户输入
- Android用户输入自动提示控件AutoCompleteTextView使用方法
- 如何使用javascript控制html中的input文本框只能输入数字
- Symbian 中各种提示、输入对话框的使用
- js实现input 的自动完成提示,Autocomplete---此文失效请使用jquery easy-ui更方便(后加)
- Symbian 中各种提示、输入对话框的使用
- 『分享』各种提示、输入对话框的使用
- 查看网页的时候,提示使用XSL样式表无法查看XML输入,如何解决?
- Android开发中使用Eclipse创建工程后提示The project cannot be built until build path errors are resolved问题的解决方法