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

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

要实现输入起始点的路线规划,需要两个输入框,可以将两个输入框设置在和地图同一个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代码如下:

android:gravity="center_vertical"

android:layout_width="match_parent"

android:layout_height="40dp">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="起点:"/>

android:id="@+id/Start_Edt_Address_school"

android:layout_weight="2"

android:layout_width="0dp"

android:hint="地址"

android:layout_height="match_parent" />

android:layout_marginTop="40dp"

android:gravity="center_vertical"

android:layout_width="match_parent"

android:layout_height="40dp">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="终点:"/>

android:id="@+id/End_Edt_Address_school"

android:layout_weight="2"

android:layout_width="0dp"

android:hint="地址"

android:layout_height="match_parent" />

android:layout_marginTop="80dp"

android:gravity="center_vertical"

android:layout_width="match_parent"

android:layout_height="40dp">

android:id="@+id/btn_drive_school"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

android:text="骑行规划" />

android:id="@+id/btn_bus_school"

android:text="公交规划"

android:layout_weight="1"

android:layout_width="0dp"

android:layout_height="match_parent" />

上面代码直接复制粘贴,在activity_input_address.xml布局文件中添加,如下:

364ce71164aba5e8e6e9c0ffc4e9306c.png

效果如下:

a5fa1c259a34868a2b32634231323877.png

将布局文件和Activity关联。直接在onCreate中添加

setContentView(R.layout.activity_input_address);

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

24525634ff713a07e8471886895105de.png

实现页面之间值的传递

MainActivity跳转到InputSEAddressActivity

对MainActivity中作如下修改:

找到button和onClick方法:

9b3fb8f67147d1f0590c952f5e81e43c.png

对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 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();

}

}

}

到此就可以实现起始点地址输入的路线导航。

运行之后效果:

测试的路线从上海博物馆到上海大剧院,如图:

c8ad2030d949eb132913564990935b85.png

d6a20f7ab7909e7295ec6100fcf97c22.png

看似很完美,其实存在挺早的问题。仅到目前还不能实现模糊搜索,而且精度不高。就是说一些比较小的地点,或者地址输错一个字,都找不到结果。并且不能在输入时根据关键词搜索地点,然后用列表展示出来。

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

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

——————————————————————————

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值