实现起始点输入的路线规划
要实现输入起始点的路线规划,需要两个输入框,可以将两个输入框设置在和地图同一个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,否则将闪退。
实现页面之间值的传递
MainActivity跳转到InputSEAddressActivity
对MainActivity中作如下修改:
找到button和onClick方法:
对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搜索中得到初步解决。
为了不让一篇文章内容太多,所以将骑行和驾车规划放到下一篇文章。
——————————————————————————
版权所有,转载请标明出处。 觉得有用请点个赞。
来源:CSDN
作者:Ace_bb
链接:https://blog.csdn.net/Ace_bb/article/details/104461149