基于Android平台的出租打车软件app

基于Android平台的出租打车软件app

文章目录

1. 基于安卓平台出租打车软件app2. 项目涉及到的技术点3. 开发环境2. 本系统可分为三个端: 用户端,车主端,管理远端3. 部分代码实现

1. 基于安卓平台出租打车软件app

需求背景

城市生活中,出租车已经成为人们日常出行经常使用的交通工具。但城市里每天上下班时间人流较大,给人的出行带来不便,有些偏远的地区也许只有少数的公交车,上下班时人数又比较多,上不了公交,而这些地方招出租车也比较困难。针对上下班高峰期以及偏远地区打的难的情况推出的一款基于android平台的打车软件,并提供打车功能,节约时间和出行成本。

2. 项目涉及到的技术点

app移动端:

网络模块,数据通讯:okhttp (网络框架)json数据解析:gson (数据解析框架)图片加载:Glide(图片加载框架)列表控件:(RecyclerView)项目涉及到的常用布局(LinearLaout+RelativieLaout)项目涉及到的常用控件 ImageView,TextView,EditText,Button,Dialog等项目采用Activity+Fragment实现UI搭建bottom-navigation-bar主页底部导航栏

服务端:

springBoot搭建服务端Mybatis(数据持久层框架)服务器: tomcat数据库:mysql 8.0 +数据库可视化工具: Navicat

3. 开发环境

app移动端:

开发软件: AndoridStudio开发语言:javajdk版本:11+以上

服务端:

开发软件:idea开发语言:Java数据库:mysql 8.0 +数据库可视化工具: Navicat

2. 本系统可分为三个端: 用户端,车主端,管理远端

用户端:

登录,注册发布订单我的订单支付(微信,支付宝)公告修改密码反馈意见个人中心

车主端:

登录,注册接单我的接单列表个人中心对用户订单反馈意见公告个人信息修改密码

管理员端:

登录注册用户管理反馈管理(收入,支出)统计管理公告管理

3. 部分代码实现

发布订单

/**

* 发布订单

*/

public class PushActivity extends BaseActivity {

@Override

protected ActivityPushBinding getViewBinding() {

return ActivityPushBinding.inflate(getLayoutInflater());

}

@Override

protected void setListener() {

mBinding.push.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

String startAddress = mBinding.startAdress.getText().toString().trim();

String endAddress = mBinding.endAdress.getText().toString().trim();

String push_time = mBinding.timepicker.getText().toString().trim();

if (TextUtils.isEmpty(startAddress) || TextUtils.isEmpty(endAddress) || TextUtils.isEmpty(push_time)) {

showToast("请完善信息");

} else {

String price = Tools.getPrice();

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

builder.setTitle("确定要发布吗?");

builder.setMessage("预计" + price + "元");

builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

}

});

builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

push(startAddress, endAddress, price, push_time);

}

});

builder.show();

}

}

});

Calendar startDate = Calendar.getInstance();

Calendar endDate = Calendar.getInstance();

//正确设置方式 原因:注意事项有说明

endDate.set(2100, 11, 31);

mBinding.timepicker.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

TimePickerView pvTime = new TimePickerBuilder(mContext, new OnTimeSelectListener() {

@Override

public void onTimeSelect(Date date, View v) {

mBinding.timepicker.setText(getTime(date));

}

})

.setType(new boolean[]{false, true, true, true, true, false})// 默认全部显示

.setLabel("年", "月", "日", "时", "分", "秒")//默认设置为年月日时分秒

.setRangDate(startDate, endDate)//起始终止年月日设定

.build();

pvTime.show();

}

});

}

/**

* 发布

*/

public void push(String start_address, String end_address, String order_price, String push_time) {

UserInfo userInfo = ApiConstants.getUserInfo();

if (null != userInfo) {

OkGo.get(ApiConstants.PUSH_URL)

.params("push_username", userInfo.getUsername())

.params("mobile", userInfo.getMobile())

.params("start_address", start_address)

.params("end_address", end_address)

.params("order_price", order_price)

.params("push_state", 0)

.params("push_time", push_time)

.execute(new HttpStringCallback(this) {

@Override

protected void onSuccess(String msg, String response) {

showToast(msg);

setResult(1000);

finish();

}

@Override

protected void onError(String response) {

showToast(response);

}

});

}

}

@Override

protected void initData() {

}

private String getTime(Date date) {//可根据需要自行截取数据显示

Log.d("getTime()", "choice date millis: " + date.getTime());

SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:ss");

return format.format(date);

}

}

支付页面

/**

* 支付页面

*/

public class PayDialogActivity extends BaseActivity {

private OrderInfo orderInfo;

@Override

protected ActivityPayDialogBinding getViewBinding() {

return ActivityPayDialogBinding.inflate(getLayoutInflater());

}

@Override

protected void setListener() {

mBinding.cancel.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

finish();

}

});

mBinding.confirmButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

if (null != orderInfo) {

payOrder(orderInfo.getUid());

}

}

});

}

private void payOrder(int _uid) {

OkGo.get(ApiConstants.PAY_ORDER_URL)

.params("uid", _uid)

.params("order_state", 1)

.execute(new HttpStringCallback(this) {

@Override

protected void onSuccess(String msg, String response) {

showToast(msg);

setResult(3000);

finish();

}

@Override

protected void onError(String response) {

showToast(response);

}

});

}

@Override

protected void initData() {

orderInfo = (OrderInfo) getIntent().getSerializableExtra("orderInfo");

if (null != orderInfo) {

mBinding.discountPrice.setText("¥" + orderInfo.getOrder_price());

}

}

}

统计管理

/**

* 统计管理

*/

public class StatisticalActivity extends BaseActivity {

private String[] titles = {"乘客订单", "乘客支出", "车主收入"};

private List fragmentList = new ArrayList<>();

@Override

protected ActivityStatisticalBinding getViewBinding() {

return ActivityStatisticalBinding.inflate(getLayoutInflater());

}

@Override

protected void setListener() {

}

@Override

protected void initData() {

//造数据

fragmentList.add(new OrderListFragment());

fragmentList.add(new SpendingFragment());

fragmentList.add(new InComeFragment());

//如果处理成懒加载的话,其实很简单,只要是这个方法setOffscreenPageLimit不去设置,就可以了。

// mBinding.viewPager.setOffscreenPageLimit(fragmentList.size());

mBinding.viewPager.setAdapter(new FragmentStateAdapter(this) {

@NonNull

@Override

public Fragment createFragment(int position) {

return fragmentList.get(position);

}

@Override

public int getItemCount() {

return fragmentList.size();

}

});

mBinding.tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

@Override

public void onTabSelected(TabLayout.Tab tab) {

mBinding.viewPager.setCurrentItem(tab.getPosition(), false);

}

@Override

public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

public void onTabReselected(TabLayout.Tab tab) {

}

});

TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(mBinding.tabs, mBinding.viewPager, new TabLayoutMediator.TabConfigurationStrategy() {

@Override

public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {

tab.setText(titles[position]);

}

});

//这句话很重要

tabLayoutMediator.attach();

}

}

相关推荐

HK TAS 入门
365bet中文官网

HK TAS 入门

📅 09-06 👁️ 812
说说看toto和杜拉维特马桶哪个好?
365bet中文官网

说说看toto和杜拉维特马桶哪个好?

📅 09-19 👁️ 464
《梦幻西游》手游惊魂铃法宝升级进阶效果 惊魂铃两仪四象属性介绍