Android 开发之高德地图搜索并定位到搜索位置

under 高德地图  tag     Published on May 19th , 2021 at 11:53 am

官方帮助文档,查看类

官方文档:获取 POI 数据,输入内容自动提示

官方文档:绘制点标记


效果图:
第二张 ListView 高度改了
3069257311.gif
3206330475.gif

搜索

1、布局 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

    <LinearLayout
        android:id="@+id/ll_search"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorWhite"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/tv_search"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="放大镜" />

        <EditText
            android:id="@+id/et_txt"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="7"
            android:gravity="center"
            android:hint="查找地点、公交、地铁"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/tv_cancel"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="取消" />
    </LinearLayout>

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:visibility="gone"
        android:background="@color/colorWhite"
        app:layout_constraintStart_toStartOf="@+id/ll_search"
        app:layout_constraintTop_toBottomOf="@+id/ll_search" />
</androidx.constraintlayout.widget.ConstraintLayout>

2、声明,给 EditText 设置 addTextChangedListener 监听事件,textChangeSearch() 是自定义的方法

etTxt.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        lv.setVisibility(View.VISIBLE);
        textChangeSearch(s);
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

3、自定义 Adapter,我是直接写在 MainActivity.java 里的

private class SearchAdapter extends BaseAdapter {
        List<Tip> list;

        public SearchAdapter(List<Tip> list) {
            this.list = list;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_expandable_list_item_1, null);
            TextView text1 = view.findViewById(android.R.id.text1);
            text1.setText(String.format("%s\n%s", list.get(position).getName(), list.get(position).getDistrict()));
            return view;
        }
    }

4、自定义方法 textChangeSearch(CharSequence charSequence),获取包含关键字的列表。顶部官方文档输入内容自动提示中有详细说明

    List<Tip> datas;
    SearchAdapter adapter;
    
    private void textChangeSearch(CharSequence charSequence) {
        String content = charSequence.toString().trim();//获取自动提示输入框的内容
        //第二个参数传入null或者“”代表在全国进行检索,否则按照传入的city进行检索
        InputtipsQuery inputtipsQuery = new InputtipsQuery(content, "");
        Inputtips inputtips = new Inputtips(this, inputtipsQuery);//定义一个输入提示对象,传入当前上下文和搜索对象
        inputtips.setInputtipsListener(new Inputtips.InputtipsListener() {
            @Override
            public void onGetInputtips(List<Tip> list, int errcode) {
                // errcode=1000 成功,errcode等于其他是失败
                // Tip 提供地理信息
                if (errcode == 1000 && list != null) {
                    datas = new ArrayList<>();
                    for (int i = 0; i < list.size(); i++) {
                        Tip tip = list.get(i);
                        // 当 Tip 的 getPoiID() 返回不为空,且 getPoint() 也不为空时,表示该提示词一个真实存在的POI,可直接显示在地图上。
                        if (tip.getPoiID() != null && tip.getPoint() != null) {
                            Log.e("list", "onGetInputtips: " + String.format("%s\n%s", tip.getName(), tip.getDistrict()));
                            datas.add(tip);
                        }
                    }
                    adapter = new SearchAdapter(datas);
                    lv.setAdapter(adapter);
                }
            }
        });//通过回调接口 onGetInputtips 解析返回的结果,获取输入提示返回的信息。
        // 调用 PoiSearch 的 requestInputtipsAsyn() 方法发送请求
        inputtips.requestInputtipsAsyn();
    }

5、点击取消,隐藏列表,EditText 清空,隐藏软键盘

tvCancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        datas.clear();
        adapter.notifyDataSetChanged();
        etTxt.setText("");
        // 隐藏软键盘
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
        imm.hideSoftInputFromWindow(etTxt.getWindowToken(), 0);

        lv.setVisibility(View.GONE);
    }
});

定位到搜索位置

这是一个绘制点标记的操作,顶部有官方文档

给 ListView 添加监听事件

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        lv.setVisibility(View.GONE);
        mapView.setVisibility(View.VISIBLE);
        Marker marker = aMap.addMarker(new MarkerOptions().position(new LatLng(datas.get(position).getPoint().getLatitude(), datas.get(position).getPoint().getLongitude()))
                        .title(datas.get(position).getName()).snippet(datas.get(position).getDistrict()));
        // 显示信息窗口
        marker.showInfoWindow();
        aMap.moveCamera(CameraUpdateFactory.zoomTo(16));
        aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(datas.get(position).getPoint().getLatitude(), datas.get(position).getPoint().getLongitude())));
    }
});

存:隐藏和显示软键盘


本文由 surface 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:October 15th , 2021 at 05:24 pm
分享到:Twitter  Weibo  Facebook