Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(4) 路线规划之起始点地址输入实现规划

▼魔方 西西 提交于 2020-02-24 04:18:48

实现起始点输入的路线规划

要实现输入起始点的路线规划,需要两个输入框,可以将两个输入框设置在和地图同一个Activity中,也可以新建一个Activity,来实现地址的输入,然后通过页面之间的跳转来传值。

起始点地址输入InputSEAddressActivity

新建一个Activity,代码如下:

public class InputSEAddressActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

这个不是完整代码,只是第一步。

新建一个layout布局文件

新建布局文件activity_input_address.xml,并且对控件布局进行设计。注意整个布局文件应该设置为RelativeLayout代码如下:

<LinearLayout
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="40dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="起点:"/>
        <!--        <EditText-->
        <!--            android:id="@+id/Start_Edt_City_school"-->
        <!--            android:layout_weight="1"-->
        <!--            android:layout_width="0dp"-->
        <!--            android:hint="市区"-->
        <!--            android:layout_height="match_parent" />-->
        <EditText
            android:id="@+id/Start_Edt_Address_school"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:hint="地址"
            android:layout_height="match_parent" />
    </LinearLayout>
    <LinearLayout
        android:layout_marginTop="40dp"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="40dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="终点:"/>
        <!--        <EditText-->
        <!--            android:id="@+id/End_Edt_City_school"-->
        <!--            android:layout_weight="1"-->
        <!--            android:layout_width="0dp"-->
        <!--            android:hint="市区"-->
        <!--            android:layout_height="match_parent" />-->
        <EditText
            android:id="@+id/End_Edt_Address_school"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:hint="地址"
            android:layout_height="match_parent" />
    </LinearLayout>
    <LinearLayout
        android:layout_marginTop="80dp"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="40dp">

        <Button
            android:id="@+id/btn_drive_school"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="骑行规划" />
        <Button
            android:id="@+id/btn_bus_school"
            android:text="公交规划"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />

    </LinearLayout>

上面代码直接复制粘贴,在activity_input_address.xml布局文件中添加,如下:
布局文件
效果如下:
效果
将布局文件和Activity关联。直接在onCreate中添加

        setContentView(R.layout.activity_input_address);

在AndroidManifest中声明这个Activity,否则将闪退。
声明Activity

实现页面之间值的传递

MainActivity跳转到InputSEAddressActivity

对MainActivity中作如下修改
找到button和onClick方法:
Button点击事件
对onClick中的but_RoutePlan事件作如下修改:

	case R.id.but_RoutrPlan:{
         Intent intent = new Intent(MainActivity.this,InputSEAddressActivity.class);
         startActivityForResult(intent,0x11);
         break;
    }

意思就是从MainActivity跳转到InputSEAddressActivity,但是InputSEAddressActivity会回传一个值。或者回传一个bundle。
break一定要添加,不然可能出大问题.

核心代码

MainActivity

对MainActivity中的StartRoute作如下修改,并且添加一个onActivityResult方法:

//开始规划,这里实现多种不同的路线规划方式。
    private void StarRoute(int id,ArrayList list) {
        SDKInitializer.initialize(getApplicationContext());
        //经纬度规划路线和动态输入规划路线二选一
        // 设置起、终点信息 动态输入规划路线
        PlanNode stNode = PlanNode.withCityNameAndPlaceName(list.get(0).toString(), list.get(1).toString());
        PlanNode enNode = PlanNode.withCityNameAndPlaceName(list.get(2).toString(), list.get(3).toString());

        switch (id){
            case 1:
                mSearch.walkingSearch((new WalkingRoutePlanOption())
                        .from(stNode)
                        .to(enNode));
                break;
            case 2:
                if(list.get(0).toString() == list.get(2).toString()){
                    mSearch.transitSearch((new TransitRoutePlanOption()).from(stNode).to(enNode));
                }else{
                    mSearch.masstransitSearch((new MassTransitRoutePlanOption()).from(stNode).to(enNode));
                }
                break;
            default:break;

        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 0x11){
            ArrayList address = data.getCharSequenceArrayListExtra("address");
            StarRoute(resultCode,address);
        }
    }

case 后面的 1 和 2 是从InputSEAddressActivity 回传的resultCode。

InputSEAddressActivity

InputSEAddressActivity中的完整代码如下:


public class InputSEAddressActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btnDrive, btnBus;
    private EditText start_edt_city, start_edt_address, end_edt_city, end_edt_address;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input_address);
        button();
    }

    private void button() {
        btnDrive = findViewById(R.id.btn_drive_school);
        btnBus = findViewById(R.id.btn_bus_school);

//                start_edt_city = findViewById(R.id.Start_Edt_City_school);
        start_edt_address = findViewById(R.id.Start_Edt_Address_school);
//       end_edt_city = findViewById(R.id.End_Edt_City_school);
        end_edt_address = findViewById(R.id.End_Edt_Address_school);

        //按钮事件处理
        btnDrive.setOnClickListener(this);
        btnBus.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        SDKInitializer.initialize(getApplicationContext());
        Intent intentaddress=getIntent();
        String startCity = "上海";
        String startAddress = start_edt_address.getText().toString();
        String endCity = "上海";
        String endAddress = end_edt_address.getText().toString();

        ArrayList<String> addressList = new ArrayList<>();
        addressList.add(startCity);
        addressList.add(startAddress);
        addressList.add(endCity);
        addressList.add(endAddress);
        //先判断起始点地址框输入是否为空
        if (startCity.isEmpty() || startAddress.isEmpty() || endCity.isEmpty() || endAddress.isEmpty()) {
            Toast.makeText(this, "起点和终点不能为空", Toast.LENGTH_SHORT).show();
        } else {
            Intent intent = new Intent();//新建意图
            intent.putStringArrayListExtra("address", addressList);
            switch (v.getId()) {
                case R.id.btn_drive_school:
                    setResult(1, intent);  //1是resultCode,相当于回传给MainActivity的暗号
                    break;                             //用来将意图区分开,以实现不同的路线规划
                case R.id.btn_bus_school:
                    setResult(2, intent);
                    break;
            }
            finish();
        }
    }
}

到此就可以实现起始点地址输入的路线导航。
运行之后效果:
测试的路线从上海博物馆到上海大剧院,如图:
步行路线规划输入框
步行路线规划结果
看似很完美,其实存在挺早的问题。仅到目前还不能实现模糊搜索,而且精度不高。就是说一些比较小的地点,或者地址输错一个字,都找不到结果。并且不能在输入时根据关键词搜索地点,然后用列表展示出来。

这些问题将在后面的POI搜索中得到初步解决。

为了不让一篇文章内容太多,所以将骑行和驾车规划放到下一篇文章。

——————————————————————————
版权所有,转载请标明出处。 觉得有用请点个赞。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!