app/src/main/AndroidManifest.xml
@@ -69,6 +69,9 @@ tools:remove="android:dataExtractionRules" tools:replace="android:allowBackup,android:theme"> <activity android:name=".ui.to_city.ChangePriceActivity" android:exported="false" /> <activity android:name=".ui.to_city.AddCityRouteLineActivity" android:exported="false" /> <activity app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/OrderPayBean.java
@@ -17,12 +17,16 @@ */ private String timestamp; @SerializedName("package") @SerializedName(value = "package",alternate = "packageStr") private String packageX; @SerializedName(value = "appId") private String appid; private String sign; @SerializedName(value = "partnerId") private String partnerid; @SerializedName(value = "prepayId") private String prepayid; @SerializedName(value = "nonceStr") private String noncestr; public String tn; app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/ShiftDetail.kt
@@ -1,11 +1,17 @@ package cn.ptaxi.yuekeduocx.driver.bean import android.os.Parcelable import com.amap.api.maps.AMapUtils import com.amap.api.maps.model.LatLng import kotlinx.android.parcel.Parcelize data class ShiftDetail( val code: Int, val `data`: ShiftDetailData, val msg: String ) @Parcelize data class ShiftDetailData( val carBrand: String, val carColor: String, @@ -40,5 +46,33 @@ val endLonLat: String, val startTime: String, val totalSeat: Int, val unitPrice: Double ) val unitPrice: Double, val sex: String,//性别 val endDetailList: List<SelfEndAddressPriceInfo>?,//终点详情列表 ) : Parcelable { //是否是自主行程 fun isSelfCityRouteLine() = lineId == -1 //匹配目的地信息 fun matchEndInfo(endLat: String, endLon: String): SelfEndAddressPriceInfo? { return endDetailList?.find { AMapUtils.calculateLineDistance( LatLng(endLat.toDoubleOrNull() ?: 0.0, endLon.toDoubleOrNull() ?: 0.0), LatLng(it.endLat?.toDoubleOrNull() ?: 0.0, it.endLon?.toDoubleOrNull() ?: 0.0) ) <= (it.range?.toDoubleOrNull() ?: 0.0) } } //获取显示性别 fun getShowSex() = if (sex == "1") "男" else "女" } @Parcelize data class SelfEndAddressPriceInfo( val endAddress: String?, val endCityName: String?, val endLon: String?, val endLat: String?, val price: String?, val range: String?, ) : Parcelable {} app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/UserInfoBean.java
@@ -389,7 +389,21 @@ } /** * 是否能够下线支付 * 是否允许选座 */ public boolean couldSelectSeat() { return "1".equalsIgnoreCase(isCanSelectSeat); } /** * 是否可修改金额(1=是,2=否) */ public boolean couldModifyAmount() { return "1".equalsIgnoreCase(isCanModifyAmount); } /** * 是否能够线下支付 */ public boolean couldOfflinePay() { return "1".equalsIgnoreCase(isOfflinePay); app/src/main/java/cn/ptaxi/yuekeduocx/driver/bean/WxBean.kt
@@ -1,5 +1,7 @@ package cn.ptaxi.yuekeduocx.driver.bean import com.google.gson.Gson /** * @ClassName WxBean * @Description TODO @@ -9,8 +11,25 @@ */ data class WxBean( val code: Int, val `data`: OrderPayBean, val `data`: ResultBean, val msg: String ) data class ResultBean( val code: Int, val `data`: PayBean, val msg: String ) data class PayBean( val res: String, val paymentOrderId: String, val payProductEnum: String, val merchantSerialNo: String, ) { fun getPayInfoModel(): OrderPayBean { return Gson().fromJson(res, OrderPayBean::class.java) } } app/src/main/java/cn/ptaxi/yuekeduocx/driver/extension/FragmentExtension.kt
New file @@ -0,0 +1,20 @@ package cn.ptaxi.yuekeduocx.driver.extension import android.app.Activity import androidx.fragment.app.Fragment import org.jetbrains.anko.internals.AnkoInternals.createIntent //扩展函数 跳转页面并接收结果 inline fun <reified T : Activity> Fragment.extStartActivityForResult( requestCode: Int, vararg params: Pair<String, Any?> ) = extStartActivityForResult(T::class.java, requestCode, params) //扩展函数 跳转页面并接收结果 fun Fragment.extStartActivityForResult( activity: Class<out Activity>, requestCode: Int, params: Array<out Pair<String, Any?>> ) { this.startActivityForResult(createIntent(context!!, activity, params), requestCode) } app/src/main/java/cn/ptaxi/yuekeduocx/driver/netUtls/Api.java
@@ -70,6 +70,7 @@ public static String queryHistoryActivity = "api/driver/queryHistoryActivity"; //api/driver/queryHistoryActivity 获取历史活动列表 public static String queryHistoryActivityInfo = "api/driver/queryHistoryActivityInfo"; //api/driver/queryHistoryActivityInfo 获取历史日期中的活动内容 public static String queryNeedCertificate = "base/driver/queryNeedCertificate"; //base/driver/queryNeedCertificate 注册完善个人信息根据选择的从业地判断是否需要网约车资格证 public static String addSelfTrip = "api/crossCity/addSelfTrip"; //api/crossCity/addSelfTrip 添加自主行程 /*** * 订单中 @@ -148,9 +149,12 @@ public static String queryDriver = "api/lineSite/queryDriver"; // api/lineSite/queryDriver 根据线路id获取线路排班数据 public static String queryLines = "api/line/scanCodeQueryLines"; ///api/line/scanCodeQueryLines 获取司机对应的线路 public static String queryLocation = "api/lineSite/queryLocation"; // /api/lineSite/queryLocation 根据站点id获取站点的区域范围数据(设置上车点和下车点) public static String selfLineQueryLocation = "api/selfLine/queryLocation"; // /api/selfLine/queryLocation 根据线路司机id获取区域范围数据(设置上车点和下车点) public static String areaMonitoring = "api/lineSite/areaMonitoring"; ///api/lineSite/areaMonitoring 判断一个点是是否在区域范围内 public static String selfLineAreaMonitoring = "api/selfLine/areaMonitoring"; ///api/selfLine/areaMonitoring 判断一个点是是否在区域范围内 public static String queryOrderMoney = "api/line/queryOrderMoney"; ///api/line/queryOrderMoney 获取跨城的支付金额 public static String payTaxiOrder = "api/order/payTaxiOrder"; ///api/order/payTaxiOrder 订单完成支付订单操作 public static String orderOnBehalfPay = "api/orderCrossCity/orderOnBehalfPay"; ///api/order/payTaxiOrder 代客下单订单完成支付订单操作 public static String queryLines_by_line = "api/line/queryLines"; ////api/line/queryLines public static String querySeat = "api/lineSite/querySeat"; //api/lineSite/querySeat 根据司机的排班id获取剩余座位数据 app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/DialogUtil.kt
@@ -23,12 +23,13 @@ import cn.ptaxi.yuekeduocx.driver.utils.citypickerview.picker.widget.listener.OnOptionsSelectListener import cn.ptaxi.yuekeduocx.driver.utils.clickDelay import cn.ptaxi.yuekeduocx.driver.utils.gone import cn.ptaxi.yuekeduocx.driver.utils.visible import cn.sinata.xldutils.utils.DensityUtil import com.zlzf.zl_payaccount.citypicker.Interface.OnCityItemClickListener import com.zlzf.zl_payaccount.citypicker.citywheel.CityConfig import com.zlzf.zl_payaccount.citypicker.style.citylist.Toast.ToastUtils import com.zlzf.zl_payaccount.citypicker.style.citypickerview.CityPickerView import kotlinx.android.synthetic.main.dialog_input_number.view.inv_number import kotlinx.android.synthetic.main.dialog_input_number.view.tv_input_label import kotlinx.android.synthetic.main.dialog_server_mode.view.rl_server_mode import kotlinx.android.synthetic.main.dialog_server_mode.view.tv_cancel_server_mode import kotlinx.android.synthetic.main.dialog_server_mode.view.tv_ok_server_mode @@ -450,12 +451,6 @@ ): EasyPopup { var pop = getPopupwindow(activity, R.layout.pop_pay) pop.showDown(activity.window.decorView) val couldOfflinePay = CacheKey.getUserInfo().couldOfflinePay() if (couldOfflinePay) { pop.contentView.btn_money.visible() } else { pop.contentView.btn_money.gone() } pop.contentView.btn_money.clickDelay { resultListener.invoke("3") pop.dismiss() @@ -491,6 +486,8 @@ ): EasyPopup { var pop = getPopupwindow(activity, R.layout.popup_window_choice_valet_pay_type) pop.showDown(activity.window.decorView) pop.contentView.ll_offline_pay.visibility = if (CacheKey.getUserInfo().couldOfflinePay()) View.VISIBLE else View.GONE var type = "" pop.contentView.ll_driver_pay.clickDelay { pop.contentView.iv_driver_pay.setImageResource(R.mipmap.icon_tick_circle_red) @@ -523,4 +520,23 @@ } return pop } //获取显示输入数字弹窗 fun getInputNumberDialog( context: Context, value: String, digitCount: Int, completeListener: (String) -> Unit, ): Dialog { val dialog = getDialog(context, R.layout.dialog_input_number) val view = getView(dialog) view.tv_input_label.text = "请输入客户手机后${digitCount}位" view.inv_number.digitCount = digitCount view.inv_number.value = value view.inv_number.setOnInputCompleteListener { completeListener.invoke(it) dialog.dismiss() } return dialog } } app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/adapter/MainAdapter.kt
@@ -3,26 +3,23 @@ import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import cn.ptaxi.yuekeduocx.driver.R import cn.ptaxi.yuekeduocx.driver.base.BaseRvAdapter import cn.ptaxi.yuekeduocx.driver.base.BaseViewHolder import cn.ptaxi.yuekeduocx.driver.base.Const import cn.ptaxi.yuekeduocx.driver.base.MyBaseActivity import cn.sinata.xldutils.utils.* import cn.ptaxi.yuekeduocx.driver.R import cn.ptaxi.yuekeduocx.driver.base.* import cn.ptaxi.yuekeduocx.driver.bean.OrderListBean import cn.ptaxi.yuekeduocx.driver.netUtls.Api import cn.ptaxi.yuekeduocx.driver.netUtls.callNet import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil import cn.ptaxi.yuekeduocx.driver.ui.main.* import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.PayQrCodeActivity import cn.ptaxi.yuekeduocx.driver.ui.main.OrderOverActivity import cn.ptaxi.yuekeduocx.driver.ui.main.ReassignNewActivity import cn.ptaxi.yuekeduocx.driver.ui.main.TripActivity import cn.ptaxi.yuekeduocx.driver.ui.main.TripPoolingActivity import cn.ptaxi.yuekeduocx.driver.ui.main.major.MajorSureMoneyActivity import cn.ptaxi.yuekeduocx.driver.ui.main.small_cargo.SmallCargoActivity import cn.ptaxi.yuekeduocx.driver.ui.main.small_cargo.SmallOverActivity import cn.ptaxi.yuekeduocx.driver.ui.pub.ImageActivity import cn.ptaxi.yuekeduocx.driver.ui.to_city.TripCityActivity import cn.ptaxi.yuekeduocx.driver.utils.Cache.CacheKey import cn.ptaxi.yuekeduocx.driver.utils.clickDelay import cn.ptaxi.yuekeduocx.driver.utils.doubleTwo import cn.ptaxi.yuekeduocx.driver.utils.glide.GlideUtil @@ -30,14 +27,30 @@ import cn.ptaxi.yuekeduocx.driver.utils.setDrawableLeft import cn.ptaxi.yuekeduocx.driver.utils.textColor import cn.ptaxi.yuekeduocx.driver.utils.visible import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram import com.tencent.mm.opensdk.openapi.WXAPIFactory import kotlinx.android.synthetic.main.activity_reassign.* import kotlinx.android.synthetic.main.item_main_list.view.* import kotlinx.android.synthetic.main.pop_pay_city.view.* import kotlinx.android.synthetic.main.item_main_list.view.iv_image_mine import kotlinx.android.synthetic.main.item_main_list.view.ll_drover_img import kotlinx.android.synthetic.main.item_main_list.view.ll_small_cargo import kotlinx.android.synthetic.main.item_main_list.view.ll_user_img import kotlinx.android.synthetic.main.item_main_list.view.recycler_view_user_img2 import kotlinx.android.synthetic.main.item_main_list.view.rl_overtime import kotlinx.android.synthetic.main.item_main_list.view.tv_cancel import kotlinx.android.synthetic.main.item_main_list.view.tv_end import kotlinx.android.synthetic.main.item_main_list.view.tv_money_cargo import kotlinx.android.synthetic.main.item_main_list.view.tv_overtime import kotlinx.android.synthetic.main.item_main_list.view.tv_pay import kotlinx.android.synthetic.main.item_main_list.view.tv_people_num import kotlinx.android.synthetic.main.item_main_list.view.tv_pooling import kotlinx.android.synthetic.main.item_main_list.view.tv_remark import kotlinx.android.synthetic.main.item_main_list.view.tv_smart_time_show import kotlinx.android.synthetic.main.item_main_list.view.tv_start import kotlinx.android.synthetic.main.item_main_list.view.tv_statue import kotlinx.android.synthetic.main.item_main_list.view.tv_time import kotlinx.android.synthetic.main.item_main_list.view.tv_type import org.jetbrains.anko.startActivity class MainAdapter : BaseRvAdapter<OrderListBean.DataBean>() { //代客支付监听 private var valetPayListener: ((item: OrderListBean.DataBean) -> Unit)? = null override fun getLayoutResId(viewType: Int): Int { return R.layout.item_main_list } @@ -47,7 +60,6 @@ it.itemView.rl_overtime.gone() it.itemView.tv_cancel.gone() it.itemView.tv_pay.gone() it.itemView.tv_qr.gone() it.itemView.tv_people_num.setDrawableLeft(R.drawable.bg_point_black) it.itemView.tv_remark.setDrawableLeft(R.drawable.bg_point_black) it.itemView.ll_drover_img.visible() @@ -69,7 +81,7 @@ if (item.rideType == "3") { it.itemView.tv_statue.text = item.statePinStr() // it.itemView.tv_statue.textColor(context, if (it.itemView.tv_statue.getContent() == "服务中") R.color.main_blue else R.color.gray_93) it.itemView.tv_statue.textColor(context,R.color.main_blue) it.itemView.tv_statue.textColor(context, R.color.main_blue) it.itemView.tv_type.text = "专车拼车订单" it.itemView.tv_people_num.visible() it.itemView.tv_people_num.setDrawableLeft(R.mipmap.icon_people_gray) @@ -79,14 +91,17 @@ context, if (item.spellSuccess == "0") R.color.white else R.color.main_blue ) it.itemView.tv_pooling.text = if (item.spellSuccess == "0") "未拼成" else "已拼成" it.itemView.tv_pooling.text = if (item.spellSuccess == "0") "未拼成" else "已拼成" it.itemView.tv_pooling.isSelected = item.spellSuccess == "0" } } 2 -> { it.itemView.tv_people_num.gone() it.itemView.tv_remark.gone() } 3 -> { it.itemView.tv_people_num.visible() it.itemView.tv_remark.visible() @@ -100,7 +115,6 @@ if (item.state == 7) { it.itemView.tv_cancel.visible() it.itemView.tv_pay.visible() it.itemView.tv_qr.visible() it.itemView.tv_cancel.setOnClickListener { DialogUtil.getDelAndSureDialog(context, "是否取消此订单?", {}, { var map = getMapByAny() @@ -115,23 +129,16 @@ }) } it.itemView.tv_pay.setOnClickListener { val api = WXAPIFactory.createWXAPI(context, Const.WX_APP_ID, true) val req = WXLaunchMiniProgram.Req() req.userName = "gh_b291a8beb1cb" req.path = "pages/orderDetail/orderDetail?orderId=${item.id}&driverId=${CacheKey.getUserId()}" req.miniprogramType = Api.MINI_TYPE api.sendReq(req) } it.itemView.tv_qr.setOnClickListener { val act = context as MyBaseActivity act.startActivity<PayQrCodeActivity>("money" to item!!.payMoney) valetPayListener?.invoke(item) } } } 4, 5 -> { it.itemView.rl_overtime.visible() if (item.arriveTimeExpect.isNotEmpty()) { it.itemView.tv_smart_time_show.text = "要求送达时间:" + item.arriveTimeExpect it.itemView.tv_smart_time_show.text = "要求送达时间:" + item.arriveTimeExpect } else { it.itemView.rl_overtime.gone() } @@ -180,12 +187,14 @@ "orderType" to item.type.toString() ) } 6, 9,10 -> { 6, 9, 10 -> { context.startActivity<SmallOverActivity>( "orderId" to item.id.toString(), "orderType" to item.type.toString() ) } 11 -> { context.startActivity<ReassignNewActivity>( "orderId" to item.id.toString(), @@ -204,6 +213,7 @@ "orderType" to item.type.toString() ) } 6 -> { if (item.type.toString() == "1") { context.startActivity<MajorSureMoneyActivity>( @@ -218,18 +228,21 @@ ) } } 7, 12 -> { context.startActivity<OrderOverActivity>( "orderId" to item.id.toString(), "orderType" to item.type.toString() ) } 8, 9, 10 -> { context.startActivity<OrderOverActivity>( "orderId" to item.id.toString(), "orderType" to item.type.toString() ) } 11 -> { context.startActivity<ReassignNewActivity>( "orderId" to item.id.toString(), @@ -274,9 +287,11 @@ 11 -> { toast("订单改派中") } 7, 12 -> { toast("订单待支付") } 10 -> { toast("订单已取消") } @@ -294,4 +309,9 @@ } } } //设置代客支付监听 fun setValetPayListener(valetPayListener: ((item: OrderListBean.DataBean) -> Unit)?) { this.valetPayListener = valetPayListener } } app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/MineOrderFragment.kt
@@ -1,14 +1,24 @@ package cn.ptaxi.yuekeduocx.driver.ui.main import android.app.Activity import android.content.Intent import android.view.View import cn.ptaxi.yuekeduocx.driver.base.BaseEvent import cn.ptaxi.yuekeduocx.driver.base.BaseRecyclerFragment import cn.ptaxi.yuekeduocx.driver.bean.AlipayBean import cn.ptaxi.yuekeduocx.driver.bean.OrderListBean import cn.ptaxi.yuekeduocx.driver.bean.WxBean import cn.ptaxi.yuekeduocx.driver.extension.extStartActivityForResult import cn.ptaxi.yuekeduocx.driver.netUtls.Api import cn.ptaxi.yuekeduocx.driver.netUtls.callNet import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil import cn.ptaxi.yuekeduocx.driver.ui.adapter.MainAdapter import java.util.HashMap import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.PayQrCodeActivity import cn.ptaxi.yuekeduocx.driver.utils.toast import cn.ptaxi.yuekeduocx.driver.wxapi.WXPayEntryActivity class MineOrderFragment:BaseRecyclerFragment<OrderListBean.DataBean>(MainAdapter()) { class MineOrderFragment : BaseRecyclerFragment<OrderListBean.DataBean>(MainAdapter()) { var state = 1 //1=全部,2=待支付,3=已取消 @@ -17,7 +27,7 @@ } override fun mapObject(): HashMap<String?, Any?>? { var map = getMapByAny() val map = getMapByAny() map["state"] = state return map } @@ -27,7 +37,7 @@ } override fun getDatas(t: String?): List<OrderListBean.DataBean> { var data = gson.fromJson<OrderListBean>(t,OrderListBean::class.java) val data = gson.fromJson<OrderListBean>(t, OrderListBean::class.java) return data.data } @@ -35,7 +45,51 @@ } override fun initView() { (adapter as MainAdapter).setValetPayListener { DialogUtil.getValetPayTypeChoiceDialog(context as Activity) { type -> pay(type, it.id.toString()) } } } //支付 private fun pay(type: String, orderId: String) { val map = getMapByAny() map["crossCityOrderId"] = orderId map["orderType"] = "3" map["type"] = type callNet(Api.orderOnBehalfPay, map) { if (type == "1") {//微信支付 val data = gson.fromJson<WxBean>(it, WxBean::class.java) WXPayEntryActivity.to(context, 1, data.data.data.getPayInfoModel()) } if (type == "2") {//乘客 val data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java) if (data.data.isNullOrEmpty()) { toast("无法使用二维码支付") return@callNet } extStartActivityForResult<PayQrCodeActivity>(1, "url" to data.data) } if (type == "3") {//线下 refresh() } } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 1) { refresh() } } override fun onEventMainThread(event: BaseEvent?) { super.onEventMainThread(event) when (event!!.code) { BaseEvent.PAY_SUCCESS -> { refresh() } } } } app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/ReassignActivity.kt
@@ -1,5 +1,6 @@ package cn.ptaxi.yuekeduocx.driver.ui.main import android.app.Activity import android.content.Intent import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -45,6 +46,8 @@ ReassignAdapter() } //支付类型 var payType = "" override fun setContentView() { setContentView(R.layout.activity_reassign) } @@ -103,6 +106,7 @@ } private fun showPat(payType: String) { this.payType = payType if (orderType == "3") { callGp(payType) return @@ -126,11 +130,11 @@ if (payType == "4") { var data = gson.fromJson<WxBean>(it, WxBean::class.java) MyApplication.isPlayVoice = false UPPayAssistEx.startPay(this, null, null, data.data.tn, "00") UPPayAssistEx.startPay(this, null, null, data.data.data.getPayInfoModel().tn, "00") } if (payType == "1") { var data = gson.fromJson<WxBean>(it, WxBean::class.java) WXPayEntryActivity.to(this, 1, data.data) WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel()) } if (payType == "3" || payType.isEmpty()) { toast("改派申请已提交") @@ -141,6 +145,7 @@ orderId!!.toString() ) ) setResult(Activity.RESULT_OK, Intent()) finish() } @@ -165,7 +170,7 @@ } if (payType == "1") { var data = gson.fromJson<WxBean>(it, WxBean::class.java) WXPayEntryActivity.to(this, 1, data.data) WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel()) } if (payType == "3" || payType.isEmpty()) { toast("改派申请已提交") @@ -176,13 +181,14 @@ orderId!!.toString() ) ) setResult(Activity.RESULT_OK,Intent()) finish() } if (payType == "4") { var data = gson.fromJson<WxBean>(it, WxBean::class.java) MyApplication.isPlayVoice = false UPPayAssistEx.startPay(this, null, null, data.data.tn, "00") UPPayAssistEx.startPay(this, null, null, data.data.data.getPayInfoModel().tn, "00") } } } @@ -204,6 +210,7 @@ orderId!!.toString() ) ) setResult(Activity.RESULT_OK,Intent()) finish() } @@ -217,6 +224,7 @@ // if(orderBean.data.orderState == 11){ // toast("改派申请已提交") // EventBus.getDefault().post(BaseEvent(BaseEvent.REAGASSIGN_SUCCESS)) // setResult(Activity.RESULT_OK,Intent()) // finish() // } // } @@ -224,6 +232,9 @@ override fun onRestart() { super.onRestart() if (payType == "1") { return } var map = getMapByAny() map["orderId"] = orderId map["orderType"] = orderType @@ -238,6 +249,7 @@ orderId!!.toString() ) ) setResult(Activity.RESULT_OK,Intent()) finish() } } @@ -255,4 +267,25 @@ MyApplication.isPlayVoice = true } } override fun onEventMainThread(event: BaseEvent?) { super.onEventMainThread(event) when (event!!.code) { BaseEvent.PAY_SUCCESS -> { if (isFinishing || isDestroy) { return } toast("改派申请已提交") EventBus.getDefault().post( BaseEvent( BaseEvent.REAGASSIGN_SUCCESS, orderId!!.toString(), orderId!!.toString() ) ) setResult(Activity.RESULT_OK,Intent()) finish() } } } } app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/add_order/AddCityOrderActivity.kt
@@ -425,7 +425,7 @@ callNet(Api.payTaxiOrder, map) { if (paytype == "1"){ var data = gson.fromJson<WxBean>(it,WxBean::class.java) WXPayEntryActivity.to(this, 1, data.data) WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel()) } if (paytype == "2") { var data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java) @@ -434,7 +434,7 @@ if (paytype == "4") { var data = gson.fromJson<WxBean>(it, WxBean::class.java) MyApplication.isPlayVoice = false UPPayAssistEx.startPay(this,null,null,data.data.tn,"00") UPPayAssistEx.startPay(this,null,null,data.data.data.getPayInfoModel().tn,"00") } if (paytype == "3" || paytype.isEmpty()) { var data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java) app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/main/add_order/SelectStartPointActivity.kt
@@ -15,7 +15,6 @@ import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny import cn.ptaxi.yuekeduocx.driver.utils.clickDelay import com.amap.api.fence.GeoFence import com.amap.api.fence.GeoFenceListener import com.amap.api.maps.AMap import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Marker @@ -59,6 +58,10 @@ intent.getStringExtra("cityName") } val lineShiftDriverId by lazy { intent.getStringExtra("lineShiftDriverId") } val lonLat by lazy { intent.getStringExtra("lonLat") } @@ -70,11 +73,6 @@ //标题 val title by lazy { intent.getStringExtra("title") } //是否使用站点 val useSite by lazy { intent.getBooleanExtra("useSite", true) } var map: AMap? = null @@ -101,64 +99,75 @@ tv_city_name.text = "" callDistrict() searchByCityName() searchByLineShiftDriverId() tv_sure.clickDelay { if (currentPosition == null) { toast("加载中请稍等...") return@clickDelay } AMapKit.getAddress( this, currentPosition!!.latitude, currentPosition!!.longitude ) { adcode -> if (adcode.isNullOrEmpty()) { toast("查询失败,请重试") return@getAddress } if (!useSite) { currentPosition?.let { EventBus.getDefault().post( BaseEvent( BaseEvent.SELECT_POINT_SITE_DETAIL, currentSiteStr, currentPosition!!.latitude.toString(), it.longitude.toString() ) ) onBackPressed() } return@getAddress } var map = getMapByAny() map["code"] = adcode validateAddress(currentPosition!!) } } //验证地址 private fun validateAddress(currentPosition: LatLng) { if (TextUtils.isEmpty(startCityId) && TextUtils.isEmpty(endCityId)) { if (TextUtils.isEmpty(lineShiftDriverId)) { selectSuccess(currentPosition) } else { val map = getMapByAny() map["lonLat"] = currentPosition!!.longitude.toString() + "," + currentPosition!!.latitude.toString() map["siteId"] = if (startCityId.isNullOrEmpty()) endCityId else startCityId callNet(Api.areaMonitoring, map) { var bean = gson.fromJson<QueryPositionBean>(it, QueryPositionBean::class.java) currentPosition.longitude.toString() + "," + currentPosition.latitude.toString() map["lineShiftDriverId"] = lineShiftDriverId map["type"] = type callNet(Api.selfLineAreaMonitoring, map) { val bean = gson.fromJson<QueryPositionBean>(it, QueryPositionBean::class.java) if (bean.data == -1) { toast("您选择的地址不在服务范围内") return@callNet } else { currentPosition?.let { EventBus.getDefault().post( BaseEvent( BaseEvent.SELECT_POINT_SITE_DETAIL, currentSiteStr, currentPosition!!.latitude.toString(), it.longitude.toString() ) ) onBackPressed() } selectSuccess(currentPosition) } } } return } AMapKit.getAddress(this, currentPosition.latitude, currentPosition.longitude) { adcode -> if (adcode.isNullOrEmpty()) { toast("查询失败,请重试") return@getAddress } val map = getMapByAny() map["code"] = adcode map["lonLat"] = currentPosition.longitude.toString() + "," + currentPosition.latitude.toString() map["siteId"] = if (startCityId.isNullOrEmpty()) endCityId else startCityId callNet(Api.areaMonitoring, map) { val bean = gson.fromJson<QueryPositionBean>(it, QueryPositionBean::class.java) if (bean.data == -1) { toast("您选择的地址不在服务范围内") return@callNet } else { selectSuccess(currentPosition) } } } } private fun moveLisener() { //选择成功 private fun selectSuccess(currentPosition: LatLng) { EventBus.getDefault().post( BaseEvent( BaseEvent.SELECT_POINT_SITE_DETAIL, currentSiteStr, currentPosition.latitude.toString(), currentPosition.longitude.toString() ) ) onBackPressed() } private fun moveListener() { AMapKit.addMapMoveListener(map!!, marker!!) { position -> currentPosition = LatLng(position.latitude, position.longitude) searchPoint(position) @@ -205,7 +214,7 @@ }?.also { it -> if (!lonLat.isNullOrEmpty()) { val split = lonLat.split(",") val latLng = LatLng(split[0].toDouble(), split[1].toDouble()) val latLng = LatLng(split[1].toDouble(), split[0].toDouble()) AMapKit.moveCamera(map!!, latLng) { if (isFinishing || isDestroy) { return@moveCamera @@ -214,22 +223,60 @@ } return@also } AMapKit.searchByText(this, "${it}火车站", it, object : PoiSearch.OnPoiSearchListener { override fun onPoiSearched(p0: PoiResult?, p1: Int) { p0?.pois?.firstOrNull()?.also { val latLng = LatLng(it.latLonPoint.latitude, it.latLonPoint.longitude) AMapKit.moveCamera(map!!, latLng) { if (isFinishing || isDestroy) { return@moveCamera AMapKit.searchByText( this, "${it}火车站", it, object : PoiSearch.OnPoiSearchListener { override fun onPoiSearched(p0: PoiResult?, p1: Int) { p0?.pois?.firstOrNull()?.also { val latLng = LatLng(it.latLonPoint.latitude, it.latLonPoint.longitude) AMapKit.moveCamera(map!!, latLng) { if (isFinishing || isDestroy) { return@moveCamera } addMk(latLng) } addMk(latLng) } } } override fun onPoiItemSearched(p0: PoiItem?, p1: Int) { override fun onPoiItemSearched(p0: PoiItem?, p1: Int) { } }) } } } //通过线路司机id搜索 private fun searchByLineShiftDriverId() { map_view.post { lineShiftDriverId?.takeIf { it.isNotEmpty() }?.also { it -> val map = getMapByAny() map["lineShiftDriverId"] = it map["type"] = type callNet(Api.selfLineQueryLocation, map) { val bean = gson.fromJson<DistrictQueryBean>(it, DistrictQueryBean::class.java) for (item in bean.data) { if (item.type == 1) { // integer($int32) 区域类型(1=行政区域,2=电子围栏) var contentStr = "" if (item.province.isNotEmpty()) { contentStr = item.province } if (item.city.isNotEmpty()) { contentStr = item.city } if (item.district.isNotEmpty()) { contentStr = item.district } searchName(contentStr) } else { addPointList(item.coordinate) } } }) } } } } @@ -241,7 +288,7 @@ val map = getMapByAny() map["siteId"] = if (startCityId.isNullOrEmpty()) endCityId else startCityId callNet(Api.queryLocation, map) { var bean = gson.fromJson<DistrictQueryBean>(it, DistrictQueryBean::class.java) val bean = gson.fromJson<DistrictQueryBean>(it, DistrictQueryBean::class.java) for (item in bean.data) { if (item.type == 1) { // integer($int32) 区域类型(1=行政区域,2=电子围栏) var contentStr = "" @@ -263,13 +310,13 @@ } private fun addPointList(coordinate: String) { var latAll = coordinate.split(";") val latAll = coordinate.split(";") if (latAll.size > 2) { var allLat = mutableListOf<LatLng>() val allLat = mutableListOf<LatLng>() for (item in latAll) { var point = item.split(",") val point = item.split(",") if (point.size == 2) { var lat = LatLng(point[1].toDouble(), point[0].toDouble()) val lat = LatLng(point[1].toDouble(), point[0].toDouble()) allLat.add(lat) } } @@ -291,8 +338,8 @@ // }) } if (latAll.size == 2) { var point = latAll[0].split(",") var dpoint = LatLng(point[1].toDouble(), point[0].toDouble()) val point = latAll[0].split(",") val dpoint = LatLng(point[1].toDouble(), point[0].toDouble()) AMapKit.drawCricle(this, map!!, dpoint, latAll[1].toDouble()) AMapKit.moveCamera(map!!, dpoint) addMk(LatLng(dpoint.latitude, dpoint.longitude)) @@ -304,8 +351,8 @@ } fun searchName(str: String) { AMapKit.drawFenceByCity(this, str, GeoFenceListener { p0, p1, p2 -> private fun searchName(str: String) { AMapKit.drawFenceByCity(this, str) { p0, p1, _ -> if (p1 == GeoFence.ADDGEOFENCE_SUCCESS) { for (item in p0) { for (itemP in item.pointList) { @@ -324,18 +371,15 @@ } } } }) } } fun addFirstMarket() { } fun addMk(lat: LatLng) { private fun addMk(lat: LatLng) { if (marker == null) { val view = createView(R.layout.item_map_point, this) marker = AMapKit.addMarker(map!!, lat.latitude, lat.longitude, view, "12") currentPosition = marker?.position moveLisener() moveListener() getAddress(this, currentPosition!!.latitude, currentPosition!!.longitude) { tv_city_name.text = it } @@ -345,10 +389,10 @@ /*** * 逆地址编码 */ fun getAddress(context: Context, lat: Double, lon: Double, function: (String) -> Unit) { var geocoderSearch = GeocodeSearch(context); private fun getAddress(context: Context, lat: Double, lon: Double, function: (String) -> Unit) { val geocoderSearch = GeocodeSearch(context); // 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系 var query = RegeocodeQuery(LatLonPoint(lat, lon), 500f, GeocodeSearch.AMAP); val query = RegeocodeQuery(LatLonPoint(lat, lon), 500f, GeocodeSearch.AMAP); geocoderSearch.getFromLocationAsyn(query); geocoderSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(p0: RegeocodeResult?, p1: Int) { @@ -393,7 +437,7 @@ when (event!!.code) { BaseEvent.SELECT_SEARCH_SITE -> { isSelectFirst = true var list = event!!.msgthree.split(",") val list = event.msgthree.split(",") if (list.size == 2) { tv_site.text = list[0] tv_site_detail.text = list[1] app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/AddCityOrderActivity2.kt
@@ -1,50 +1,71 @@ package cn.ptaxi.yuekeduocx.driver.ui.to_city import android.Manifest import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Environment import android.provider.MediaStore import androidx.core.view.drawToBitmap import android.app.Activity import android.content.Intent import android.text.TextUtils import android.view.View import androidx.core.widget.addTextChangedListener import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import cn.ptaxi.yuekeduocx.driver.R import cn.sinata.xldutils.utils.SpanBuilder import cn.sinata.xldutils.utils.StringUtils import cn.ptaxi.yuekeduocx.driver.utils.clickDelay import com.amap.api.location.AMapLocationClient import com.amap.api.location.AMapLocationListener import cn.ptaxi.yuekeduocx.driver.base.BaseEvent import cn.ptaxi.yuekeduocx.driver.base.Const import cn.ptaxi.yuekeduocx.driver.base.MyBaseActivity import cn.ptaxi.yuekeduocx.driver.base.gaode.AMapKit import cn.ptaxi.yuekeduocx.driver.bean.AddOrderBean import cn.ptaxi.yuekeduocx.driver.bean.AlipayBean import cn.ptaxi.yuekeduocx.driver.bean.SeatBean import cn.ptaxi.yuekeduocx.driver.bean.ShiftDetail import cn.ptaxi.yuekeduocx.driver.bean.ShiftDetailData import cn.ptaxi.yuekeduocx.driver.bean.WxBean import cn.ptaxi.yuekeduocx.driver.netUtls.Api import cn.ptaxi.yuekeduocx.driver.netUtls.callNet import cn.ptaxi.yuekeduocx.driver.netUtls.callNetGet import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil import cn.ptaxi.yuekeduocx.driver.ui.adapter.SeatAdapter import cn.ptaxi.yuekeduocx.driver.ui.adapter.PopPeopleNUmAdapter import cn.ptaxi.yuekeduocx.driver.ui.adapter.SelectNumberAdapter import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.PayQrCodeActivity import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.SelectStartPointActivity import cn.ptaxi.yuekeduocx.driver.ui.pub.ImageActivity import cn.ptaxi.yuekeduocx.driver.utils.Cache.CacheKey import cn.ptaxi.yuekeduocx.driver.utils.glide.GlideUtil import com.tbruyelle.rxpermissions2.RxPermissions import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram import com.tencent.mm.opensdk.modelmsg.SendMessageToWX import com.tencent.mm.opensdk.modelmsg.WXMediaMessage import com.tencent.mm.opensdk.modelmsg.WXMiniProgramObject import com.tencent.mm.opensdk.openapi.WXAPIFactory import kotlinx.android.synthetic.main.activity_add_city_order2.* import kotlinx.android.synthetic.main.dialog_pay_cross.view.* import kotlinx.android.synthetic.main.pop_share.view.* import cn.ptaxi.yuekeduocx.driver.utils.clickDelay import cn.ptaxi.yuekeduocx.driver.utils.gone import cn.ptaxi.yuekeduocx.driver.utils.visible import cn.ptaxi.yuekeduocx.driver.wxapi.WXPayEntryActivity import cn.sinata.xldutils.utils.SpanBuilder import cn.sinata.xldutils.utils.StringUtils import com.amap.api.location.AMapLocationClient import com.amap.api.location.AMapLocationListener import kotlinx.android.synthetic.main.activity_add_city_order2.et_more_fee import kotlinx.android.synthetic.main.activity_add_city_order2.et_phone import kotlinx.android.synthetic.main.activity_add_city_order2.ll_edit_price import kotlinx.android.synthetic.main.activity_add_city_order2.ll_passengers_num import kotlinx.android.synthetic.main.activity_add_city_order2.ll_seat import kotlinx.android.synthetic.main.activity_add_city_order2.tv_action import kotlinx.android.synthetic.main.activity_add_city_order2.tv_car_no import kotlinx.android.synthetic.main.activity_add_city_order2.tv_date import kotlinx.android.synthetic.main.activity_add_city_order2.tv_end import kotlinx.android.synthetic.main.activity_add_city_order2.tv_end_point import kotlinx.android.synthetic.main.activity_add_city_order2.tv_had_change_price import kotlinx.android.synthetic.main.activity_add_city_order2.tv_passengers_num import kotlinx.android.synthetic.main.activity_add_city_order2.tv_price import kotlinx.android.synthetic.main.activity_add_city_order2.tv_seat import kotlinx.android.synthetic.main.activity_add_city_order2.tv_sex import kotlinx.android.synthetic.main.activity_add_city_order2.tv_start import kotlinx.android.synthetic.main.activity_add_city_order2.tv_start_point import kotlinx.android.synthetic.main.activity_add_city_order2.tv_time import kotlinx.android.synthetic.main.activity_add_city_order2.tv_total import kotlinx.android.synthetic.main.activity_add_city_order2.tv_unit import kotlinx.android.synthetic.main.pop_select_car_num.view.recycler_view_people_num import kotlinx.android.synthetic.main.pop_select_car_num.view.tv_pop_sure_people_num import kotlinx.android.synthetic.main.pop_select_car_num.view.view_top import kotlinx.android.synthetic.main.pop_select_number.view.iv_leat_num import kotlinx.android.synthetic.main.pop_select_number.view.recycler_view_people_number import kotlinx.android.synthetic.main.pop_select_number.view.tv_pop_sure_people_number import kotlinx.android.synthetic.main.pop_select_number.view.view_top_number import org.jetbrains.anko.startActivity import org.jetbrains.anko.startActivityForResult import org.jetbrains.anko.toast import java.io.ByteArrayOutputStream import java.io.File import java.io.FileOutputStream import java.text.SimpleDateFormat class AddCityOrderActivity2 : MyBaseActivity() { @@ -58,7 +79,6 @@ private val id by lazy { intent.getStringExtra("id") } private var shiftDetail: ShiftDetailData? = null private val seatAdapter = SeatAdapter() var startAddress = "" //起点 var startLat = ""//起点纬度 @@ -76,9 +96,14 @@ var mLocationClient: AMapLocationClient? = null //改价 var changePrice: String? = null val selectNumberAdapter: SelectNumberAdapter by lazy { SelectNumberAdapter() } override fun initView() { setTitleText("代客下单") setTitleText("推荐预约") mLocationClient = AMapKit.initLocation(this, AMapLocationListener { if (it.errorCode == 0) { if (!it.address.isNullOrEmpty()) { @@ -89,25 +114,28 @@ } }) getData() ll_seat.visibility = if (CacheKey.getUserInfo().couldSelectSeat()) View.VISIBLE else View.GONE ll_edit_price.visibility = if (CacheKey.getUserInfo().couldModifyAmount()) View.VISIBLE else View.GONE } private fun getData() { val map = HashMap<String,String>() val map = HashMap<String, String>() map["lineShiftDriverId"] = id callNetGet(this, Api.queryDriverShifDetail,map){ callNetGet(this, Api.queryDriverShifDetail, map) { shiftDetail = gson.fromJson(it, ShiftDetail::class.java).data shiftDetail?.apply { tv_start.text = lineName.split("-")[0] tv_end.text = lineName.split("-")[1] tv_time.text = day.split("-")[1]+"月"+day.split("-")[2]+"日 $startTime-$endTime" val unit = "¥%.2f/人".format(unitPrice) tv_unit.text = SpanBuilder.content(unit).sizeSpan(0,1,14).sizeSpan(unit.length-2,unit.length,14).build() rv_seat.layoutManager = GridLayoutManager(this@AddCityOrderActivity2,totalSeat) rv_seat.adapter = seatAdapter seatAdapter.max = laveSeat seatAdapter.data.clear() seatAdapter.data.addAll(1 .. totalSeat) seatAdapter.notifyDataSetChanged() tv_car_no.text = carLicensePlate tv_sex.text = "${getShowSex()}师傅" val parse = SimpleDateFormat("yyyy-MM-dd").parse(day) tv_date.text = "出发日期:${SimpleDateFormat("MM月dd日").format(parse)}" tv_time.text = "出发时间:${startTime}" val unit = "¥%.2f/人".format(unitPrice) tv_unit.text = SpanBuilder.content(unit).sizeSpan(0, 1, 14) .sizeSpan(unit.length - 2, unit.length, 14).build() //默认起终点 startAddress = startDefaultPointAddress startLat = startDefaultPointLat @@ -122,51 +150,91 @@ } override fun setOnclick() { seatAdapter.setOnItemClickListener { view, position -> if (position+1 > shiftDetail?.laveSeat?:0){ showToast("最多可选择${shiftDetail?.laveSeat?:0}人") }else{ seatAdapter.checked = position seatAdapter.notifyDataSetChanged() refreshPrice() tv_start_point.clickDelay { shiftDetail?.also { currentSiteType = 1 if (it.isSelfCityRouteLine()) { startActivity<SelectStartPointActivity>( "lineShiftDriverId" to it.lineShiftDriverId.toString(), "type" to "1", "lonLat" to it.startLonLat ) } else { startActivity<SelectStartPointActivity>( "startCityId" to it.startSiteId, "lonLat" to it.startLonLat ) } } } tv_start_point.setOnClickListener { currentSiteType = 1 startActivity<SelectStartPointActivity>( "startCityId" to shiftDetail?.startSiteId, "name" to shiftDetail?.startCityName, "lonLat" to shiftDetail?.startLonLat ) tv_end_point.clickDelay { shiftDetail?.also { currentSiteType = 2 if (it.isSelfCityRouteLine()) { startActivity<SelectStartPointActivity>( "lineShiftDriverId" to it.lineShiftDriverId.toString(), "type" to "2", "lonLat" to it.endLonLat ) } else { startActivity<SelectStartPointActivity>( "endCityId" to it.endSiteId, "lonLat" to it.endLonLat, ) } } } tv_end_point.setOnClickListener { currentSiteType = 2 startActivity<SelectStartPointActivity>("endCityId" to shiftDetail?.endSiteId , "name" to shiftDetail?.endCityName, "lonLat" to shiftDetail?.endLonLat) ll_passengers_num.clickDelay { showSelectPassengersNumberDialog() } tv_action.clickDelay { if (seatAdapter.checked == -1){ ll_seat.clickDelay { if (TextUtils.isEmpty(tv_passengers_num.text)) { toast("请先选择乘车人数") return@clickDelay } shiftDetail?.also { callSeat(it.lineShiftDriverId.toString()) { data -> showSelectSearDialog(it, data) } } } ll_edit_price.clickDelay { if ((tv_passengers_num.tag?.toString()?.toIntOrNull() ?: 0) <= 0) { showToast("请选择乘车人数") return@clickDelay } val phone = et_phone.text.toString() if (phone.isNullOrEmpty()){ showToast("请填写乘车人手机") shiftDetail?.also { startActivityForResult<ChangePriceActivity>( 2, "data" to it, "personNumber" to tv_passengers_num.tag?.toString(), "otherPrice" to et_more_fee.text.toString(), "changePrice" to changePrice, ) } } tv_action.clickDelay { if (startAddress.isEmpty()) { showToast("请选择出发地") return@clickDelay } if (!StringUtils.isPhoneNumberValid(phone)){ if (endAddress.isEmpty()) { showToast("请选择目的地") return@clickDelay } val phone = et_phone.text?.toString() if (phone.isNullOrEmpty()) { showToast("请输入乘车人联系电话") return@clickDelay } if (!StringUtils.isPhoneNumberValid(phone)) { showToast("手机格式错误") return@clickDelay } if (startAddress.isEmpty()){ showToast("请选择上车点") return@clickDelay } if (endAddress.isEmpty()){ showToast("请选择下车点") if ((tv_passengers_num.tag?.toString()?.toIntOrNull() ?: 0) <= 0) { showToast("请选择乘车人数") return@clickDelay } val map = getMapByAny() @@ -182,55 +250,17 @@ map["lineShiftDriverId"] = shiftDetail?.lineShiftDriverId map["otherFee"] = morefee map["passengersPhone"] = phone map["peopleNumber"] = seatAdapter.checked+1 callNet(Api.orderOnBehalf,map){ var bean = gson.fromJson<AddOrderBean>(it, AddOrderBean::class.java) recover() val dialog = DialogUtil.getDialog(this, R.layout.dialog_pay_cross) val view = DialogUtil.getView(dialog) GlideUtil.load(this,url,view.iv_code,0) view.iv_close.setOnClickListener { dialog.dismiss() } view.tv_save.clickDelay { val rrx = RxPermissions(this).request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe { if (it) try { val copyPath = getExternalFilesDir(Environment.DIRECTORY_DCIM)!!.absolutePath + "/" + System.currentTimeMillis() + ".png" val file = File(copyPath) if (!file.exists()) { file.createNewFile() } val fors = FileOutputStream(file) view.iv_code.drawToBitmap()?.compress(Bitmap.CompressFormat.PNG, 0, fors) fors.flush() fors.close() MediaStore.Images.Media.insertImage(this.contentResolver, file.absolutePath, copyPath, null); toast("保存成功") } catch (e: Exception) { toast("保存失败") } } } view.tv_scale.clickDelay { startActivity<ImageActivity>("url" to url) } view.tv_share.clickDelay { showShareDialog() } view.tv_action.clickDelay { val api = WXAPIFactory.createWXAPI(this, Const.WX_APP_ID, true) val req = WXLaunchMiniProgram.Req() req.userName = "gh_b291a8beb1cb" req.path = "pages/orderDetail/orderDetail?orderId=${bean.data.id}&driverId=${CacheKey.getUserId()}" req.miniprogramType = Api.MINI_TYPE api.sendReq(req) dialog.dismiss() finish() map["peopleNumber"] = tv_passengers_num.tag map["seatNumber"] = tv_seat.tag changePrice?.takeIf { it.isNotEmpty() }?.also { map["changePrice"] = it } callNet(Api.orderOnBehalf, map) { val bean = gson.fromJson<AddOrderBean>(it, AddOrderBean::class.java) DialogUtil.getValetPayTypeChoiceDialog(this) { type -> pay(type, bean.data.id.toString()) } } } @@ -240,103 +270,145 @@ } } private fun recover() { seatAdapter.checked = -1 morefee = 0.0 et_phone.setText("") et_more_fee.setText("") getData() } fun showShareDialog() { var dialog = DialogUtil.getDialog(mContext, R.layout.pop_share) var view = DialogUtil.getView(dialog) view.tv_item_right_share.setOnClickListener { dialog!!.dismiss() } view.view_close_share.setOnClickListener { dialog!!.dismiss() } view.ll_wechat.setOnClickListener { // share( // this, // "您有一条城际专线订单待支付", // "约客多司机端", // url, // UMImage(mContext, R.mipmap.icon), // SHARE_MEDIA.WEIXIN // ) val api = WXAPIFactory.createWXAPI(this, Const.WX_APP_ID, true) val miniProgramObj = WXMiniProgramObject() miniProgramObj.webpageUrl = url // 兼容低版本的网页链接 miniProgramObj.miniprogramType = Api.MINI_TYPE // 正式版:0,测试版:1,体验版:2 miniProgramObj.userName = "gh_b291a8beb1cb" // 小程序原始id miniProgramObj.path = "pages/home/home"//小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar" val msg = WXMediaMessage(miniProgramObj) msg.title = "约客多司机端" // 小程序消息title msg.description = "您有一条城际专线订单待支付" // 小程序消息desc msg.thumbData = getThumb() // 小程序消息封面图片,小于128k val req = SendMessageToWX.Req() req.transaction = System.currentTimeMillis().toString() req.message = msg req.scene = SendMessageToWX.Req.WXSceneSession api.sendReq(req) dialog!!.dismiss() } view.ll_wechat_q.setOnClickListener { val api = WXAPIFactory.createWXAPI(this, Const.WX_APP_ID, true) val miniProgramObj = WXMiniProgramObject() miniProgramObj.webpageUrl = url // 兼容低版本的网页链接 miniProgramObj.miniprogramType = Api.MINI_TYPE // 正式版:0,测试版:1,体验版:2 miniProgramObj.userName = "gh_b291a8beb1cb" // 小程序原始id miniProgramObj.path = "pages/home/home"//小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar" val msg = WXMediaMessage(miniProgramObj) msg.title = "约客多司机端" // 小程序消息title msg.description = "您有一条城际专线订单待支付" // 小程序消息desc msg.thumbData = getThumb() // 小程序消息封面图片,小于128k val req = SendMessageToWX.Req() req.transaction = System.currentTimeMillis().toString() req.message = msg req.scene = SendMessageToWX.Req.WXSceneTimeline api.sendReq(req) dialog!!.dismiss() //支付 private fun pay(type: String, orderId: String) { val map = getMapByAny() map["crossCityOrderId"] = orderId map["orderType"] = "3" map["type"] = type callNet(Api.orderOnBehalfPay, map) { if (type == "1") {//微信支付 val data = gson.fromJson<WxBean>(it, WxBean::class.java) WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel()) } if (type == "2") {//乘客 val data = gson.fromJson<AlipayBean>(it, AlipayBean::class.java) if (data.data.isNullOrEmpty()) { toast("无法使用二维码支付") return@callNet } startActivityForResult<PayQrCodeActivity>(1, "url" to data.data) } if (type == "3") {//线下 setResult(Activity.RESULT_OK, Intent()) finish() } } } private fun getThumb():ByteArray{ val bitmap: Bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_share) val sendBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true) bitmap.recycle() val stream = ByteArrayOutputStream() sendBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream) return stream.toByteArray() //显示选择乘客人数弹窗 private fun showSelectPassengersNumberDialog() { shiftDetail?.also { val pop = DialogUtil.getPopupwindow(this, R.layout.pop_select_car_num) pop.contentView.recycler_view_people_num.layoutManager = LinearLayoutManager(this) val popPeopleNumAdapter = PopPeopleNUmAdapter(it.laveSeat) pop.contentView.recycler_view_people_num.adapter = popPeopleNumAdapter popPeopleNumAdapter.selectPosition = 0 pop.contentView.view_top.clickDelay { pop.dismiss() } popPeopleNumAdapter.setOnItemClickListener { view, position -> popPeopleNumAdapter.selectPosition = position popPeopleNumAdapter.notifyDataSetChanged() } pop.contentView.tv_pop_sure_people_num.clickDelay { val number = popPeopleNumAdapter.selectPosition + 1 tv_passengers_num.text = number.toString() tv_passengers_num.tag = number refreshPrice() pop.dismiss() } pop.showDown(window.decorView) } } //显示选择座位弹窗 private fun showSelectSearDialog(detailData: ShiftDetailData, data: SeatBean.DataBeanX) { val list = mutableListOf<String>() val listHave = data.content.split(",") val pop = DialogUtil.getPopupwindow(this, R.layout.pop_select_number) if (detailData.totalSeat < 6) { addSeat(4, list) pop.contentView.iv_leat_num.setImageResource(R.mipmap.seat_five) } else { addSeat(6, list) pop.contentView.iv_leat_num.setImageResource(R.mipmap.seat_seven) } pop.contentView.recycler_view_people_number.layoutManager = GridLayoutManager(this, 4) pop.contentView.recycler_view_people_number.adapter = selectNumberAdapter selectNumberAdapter.haveContent.clear() selectNumberAdapter.selectPosition.clear() selectNumberAdapter.haveContent.addAll(listHave) selectNumberAdapter.data.clear() selectNumberAdapter.data.addAll(list) selectNumberAdapter.notifyDataSetChanged() pop.contentView.tv_pop_sure_people_number.clickDelay { if ((tv_passengers_num.tag?.toString()?.toIntOrNull() ?: 0) != selectNumberAdapter.selectPosition.size ) { toast("请选择" + tv_passengers_num.text + "个座位") return@clickDelay } if (selectNumberAdapter.selectPosition.size == 0) { toast("请选择位置") return@clickDelay } tv_seat.text = selectNumberAdapter.getPeopleStr().split(",") .joinToString(",") { "${it}号" } tv_seat.tag = selectNumberAdapter.getPeopleStr() pop.dismiss() } pop.contentView.view_top_number.clickDelay { pop.dismiss() } pop.showDown(window.decorView) } private fun addSeat(i: Int, list: MutableList<String>) { var c = 0 while (c < i) { c++ list.add(c.toString()) } } private fun callSeat(lineShiftDriverId: String, function: (SeatBean.DataBeanX) -> Unit) { val map = getMapByAny() map["id"] = lineShiftDriverId callNet(Api.querySeat, map) { var bean = gson.fromJson<SeatBean>(it, SeatBean::class.java) function(bean!!.data) } } private fun refreshPrice() { val ticketFee = (seatAdapter.checked + 1) * (shiftDetail?.unitPrice ?: 0.0) tv_price.text = "¥%.2f".format(ticketFee) val more = et_more_fee.text.toString() morefee = 0.0 morefee = try { more.toDouble() }catch (e:Exception){ 0.0 shiftDetail?.also { it -> val unitPrice = if (it.isSelfCityRouteLine()) { it.matchEndInfo(endLat, endLon)?.let { it.price?.toDoubleOrNull() } } else { it.unitPrice } if (unitPrice == null || (tv_passengers_num.tag?.toString()?.toIntOrNull() ?: 0) <= 0) { return@also } //原价 val oldPrice = (tv_passengers_num.tag.toString().toIntOrNull() ?: 0) * unitPrice //改价 val newPrice = changePrice?.toDoubleOrNull() if (newPrice == null || newPrice == oldPrice) { tv_had_change_price.gone() } else { tv_had_change_price.visible() } val ticketFee = newPrice ?: oldPrice tv_price.text = "¥%.2f".format(ticketFee) morefee = et_more_fee.text?.toString()?.toDoubleOrNull() ?: 0.0 tv_total.text = "¥%.2f".format(ticketFee + morefee) } tv_total.text = SpanBuilder.content("¥%.2f".format(ticketFee+morefee)).sizeSpan(0,1,22).build() } override fun onEventMainThread(event: BaseEvent?) { @@ -348,8 +420,8 @@ startLat = event.msgTwo startLon = event.msgthree tv_start_point.text = startAddress if (startAddress.length > 15){ tv_start_point.text = startAddress.substring(0,15)+"..." if (startAddress.length > 15) { tv_start_point.text = startAddress.substring(0, 15) + "..." } } if (currentSiteType == 2) { @@ -357,11 +429,32 @@ endLat = event.msgTwo endLon = event.msgthree tv_end_point.text = endAddress if (endAddress.length > 15){ tv_end_point.text = endAddress.substring(0,15)+"..." if (endAddress.length > 15) { tv_end_point.text = endAddress.substring(0, 15) + "..." } refreshPrice() } } BaseEvent.PAY_SUCCESS -> { if (isFinishing || isDestroy) { return } setResult(Activity.RESULT_OK, Intent()) finish() } } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 1) { setResult(Activity.RESULT_OK, Intent()) finish() } if (requestCode == 2 && resultCode == Activity.RESULT_OK && data != null) { changePrice = data.getStringExtra("changePrice") refreshPrice() } } app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/AddCityRouteLineActivity.kt
@@ -17,13 +17,13 @@ import cn.ptaxi.yuekeduocx.driver.netUtls.Api import cn.ptaxi.yuekeduocx.driver.netUtls.callNet import cn.ptaxi.yuekeduocx.driver.netUtls.getMapByAny import cn.ptaxi.yuekeduocx.driver.ui.DialogUtil import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.SelectCityStartActivity import cn.ptaxi.yuekeduocx.driver.ui.main.add_order.SelectStartPointActivity import cn.ptaxi.yuekeduocx.driver.utils.citypickerview.picker.widget.builder.TimePickerBuilder import cn.ptaxi.yuekeduocx.driver.utils.clickDelay import cn.ptaxi.yuekeduocx.driver.utils.gone import cn.ptaxi.yuekeduocx.driver.utils.visible import com.amap.api.maps.model.LatLng import kotlinx.android.synthetic.main.activity_add_city_route_line.ll_add_other_destination_price import kotlinx.android.synthetic.main.activity_add_city_route_line.ll_date import kotlinx.android.synthetic.main.activity_add_city_route_line.ll_destination_price_list @@ -38,6 +38,11 @@ import kotlinx.android.synthetic.main.activity_add_city_route_line.tv_start_city import kotlinx.android.synthetic.main.activity_add_city_route_line.tv_start_point import kotlinx.android.synthetic.main.activity_add_city_route_line.tv_time import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_confirm import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_destination_city import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_start_city import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.tv_start_time import kotlinx.android.synthetic.main.dialog_add_city_route_line_success.view.view_hint_close_base import org.jetbrains.anko.startActivity import org.jetbrains.anko.toast import java.text.SimpleDateFormat @@ -118,10 +123,9 @@ val event1 = tv_start_point.tag as BaseEvent? startActivity<SelectStartPointActivity>( "cityName" to event.msg, "lonLat" to if (event1 == null) null else "${event1.msgTwo},${event1.msgthree}", "lonLat" to if (event1 == null) null else "${event1.msgthree},${event1.msgTwo}", "type" to "1", "title" to "选择出发地", "useSite" to false, ) } else { toast("请先选择出发城市") @@ -140,6 +144,11 @@ return@clickDelay } if (TextUtils.isEmpty(tv_car_seat.text)) { toast("座位数不能为空") return@clickDelay } if (((tv_car_seat.tag as MyCarInfo).seat.toString().toIntOrNull() ?: 0) <= 1) { toast("座位数不能小于1") return@clickDelay } if (TextUtils.isEmpty(tv_start_city.text)) { @@ -157,7 +166,7 @@ val destinationPriceInfos = (0 until ll_destination_price_list.childCount).map { ll_destination_price_list.getChildAt(it).tag as DestinationPriceInfo } val filter = destinationPriceInfos.filter { it.address?.isNotEmpty() == true } val filter = destinationPriceInfos.filter { it.endAddress?.isNotEmpty() == true } if (filter.isEmpty()) { toast("请选择目的地") return@clickDelay @@ -210,10 +219,9 @@ val event1 = tvEndPoint.tag as BaseEvent? startActivity<SelectStartPointActivity>( "cityName" to event.msg, "lonLat" to if (event1 == null) null else "${event1.msgTwo},${event1.msgthree}", "lonLat" to if (event1 == null) null else "${event1.msgthree},${event1.msgTwo}", "type" to "2", "title" to "选择目的地", "useSite" to false, ) } else { toast("请先选择目的城市") @@ -307,7 +315,44 @@ val startCity = tv_start_city.tag as BaseEvent val endCity = tv_end_city.tag as BaseEvent val startPoint = tv_start_point.tag as BaseEvent val map = getMapByAny() map["day"] = SimpleDateFormat("yyyy-MM-dd").format(date) map["startTime"] = SimpleDateFormat("HH:mm").format(time) map["seat"] = 0.coerceAtLeast((carInfo.seat?.toIntOrNull() ?: 0) - 1) map["startCityCode"] = startCity.msgTwo map["startCityName"] = startCity.msg map["endCityCode"] = endCity.msgTwo map["endCityName"] = endCity.msg map["startAddress"] = startPoint.msg map["startLon"] = startPoint.msgthree map["startLat"] = startPoint.msgTwo map["destJson"] = gson.toJson(destinationPriceInfos) callNet(Api.addSelfTrip, map) { showAddSuccessDialog( startCity.msg, endCity.msg, SimpleDateFormat("yyyy-MM-dd").format(date), SimpleDateFormat("HH:mm").format(time) ) } } //显示添加成功弹窗 private fun showAddSuccessDialog( startCity: String, endCity: String, date: String, time: String ) { val dialog = DialogUtil.getDialog(this, R.layout.dialog_add_city_route_line_success) val view = DialogUtil.getView(dialog) view.tv_start_city.text = startCity view.tv_destination_city.text = endCity view.tv_start_time.text = "出发时间:${date} ${time}" view.view_hint_close_base.setOnClickListener { dialog.dismiss() } view.tv_confirm.setOnClickListener { dialog.dismiss() } dialog.setCancelable(false) dialog.setCanceledOnTouchOutside(false) dialog.setOnDismissListener { finish() } } override fun onEventMainThread(event: BaseEvent?) { @@ -329,12 +374,13 @@ tv_start_point.tag = event } else { currentEndPointView?.also { val tvEndPoint = findViewById<TextView>(R.id.tv_end_point) val tvEndPoint = it.findViewById<TextView>(R.id.tv_end_point) tvEndPoint.text = event.msg tvEndPoint.tag = event val info = it.tag as DestinationPriceInfo info.address = event.msg info.location = LatLng(event.msgTwo.toDouble(), event.msgthree.toDouble()) info.endAddress = event.msg info.endLat = event.msgTwo info.endLon = event.msgthree } } } @@ -344,7 +390,8 @@ //目的地价格信息 class DestinationPriceInfo( var address: String? = null, var location: LatLng? = null, var endAddress: String? = null, var endLon: String? = null, var endLat: String? = null, var price: String? = null, ) app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/ChangePriceActivity.kt
New file @@ -0,0 +1,53 @@ package cn.ptaxi.yuekeduocx.driver.ui.to_city import android.app.Activity import android.content.Intent import android.text.TextUtils import android.util.Log import cn.ptaxi.yuekeduocx.driver.R import cn.ptaxi.yuekeduocx.driver.base.MyBaseActivity import cn.ptaxi.yuekeduocx.driver.bean.ShiftDetailData import cn.ptaxi.yuekeduocx.driver.utils.clickDelay import kotlinx.android.synthetic.main.activity_change_price.et_price import kotlinx.android.synthetic.main.activity_change_price.tv_confirm import kotlinx.android.synthetic.main.activity_change_price.tv_person_num import kotlinx.android.synthetic.main.activity_change_price.tv_price import org.jetbrains.anko.toast //改价页 class ChangePriceActivity : MyBaseActivity() { private val data by lazy { intent.getParcelableExtra("data") as ShiftDetailData } private val personNumber by lazy { intent.getStringExtra("personNumber") } private val otherPrice by lazy { intent.getStringExtra("otherPrice") } private val changePrice by lazy { intent.getStringExtra("changePrice") } override fun setContentView() { setContentView(R.layout.activity_change_price) } override fun initView() { tv_person_num.text = "${personNumber}人价" tv_price.text = "¥%.2f".format( (personNumber?.toDoubleOrNull() ?: 0.0) * (data.unitPrice) + (otherPrice?.toDoubleOrNull() ?: 0.0) ) et_price.setText(changePrice ?: "") } override fun setOnclick() { tv_confirm.clickDelay { val s = et_price.text?.toString() ?: "" if (TextUtils.isEmpty(s)) { toast("请输入金额") return@clickDelay } if ((s.toDoubleOrNull() ?: 0.0) <= 0) { toast("请输入正确金额") return@clickDelay } setResult(Activity.RESULT_OK, Intent().apply { putExtra("changePrice", s) }) finish() } } } app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/to_city/SelectDriverActivity.kt
@@ -137,7 +137,7 @@ } if (payType == "1") { var data = gson.fromJson<WxBean>(it, WxBean::class.java) WXPayEntryActivity.to(this, 1, data.data) WXPayEntryActivity.to(this, 1, data.data.data.getPayInfoModel()) } if (payType == "3" || payType.isEmpty()) { EventBus.getDefault().post( @@ -154,7 +154,7 @@ if (payType == "4") { var data = gson.fromJson<WxBean>(it, WxBean::class.java) MyApplication.isPlayVoice = false UPPayAssistEx.startPay(this, null, null, data.data.tn, "00") UPPayAssistEx.startPay(this, null, null, data.data.data.getPayInfoModel().tn, "00") } } } @@ -210,6 +210,9 @@ super.onEventMainThread(event) when (event!!.code) { BaseEvent.PAY_SUCCESS -> { if (isFinishing || isDestroy) { return } setResult(Activity.RESULT_OK, Intent()) finish() } app/src/main/java/cn/ptaxi/yuekeduocx/driver/ui/widget/InputNumberView.kt
New file @@ -0,0 +1,394 @@ package cn.ptaxi.yuekeduocx.driver.ui.widget import android.animation.ValueAnimator import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.RectF import android.graphics.Typeface import android.text.InputFilter import android.text.InputType import android.text.method.DigitsKeyListener import android.util.AttributeSet import android.util.TypedValue import android.view.Gravity import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.FrameLayout import android.widget.LinearLayout import androidx.appcompat.widget.AppCompatTextView import androidx.core.widget.addTextChangedListener import cn.ptaxi.yuekeduocx.driver.R import cn.ptaxi.yuekeduocx.driver.extension.extDpToPx /** * 输入数字控件 * 支持动态设置数字位数,自动聚焦,键盘控制 */ class InputNumberView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { // 属性 var value: String? = null set(value) { if (field != value) { field = value post { setupView() } } } var digitCount = 4 set(value) { if (value > 0 && value != field) { field = value post { setupView() } } } var rectWidth = 48 set(value) { field = value post { setupView() } } var rectHeight = 56 set(value) { field = value post { setupView() } } var rectRadius = 8 set(value) { field = value requestLayout() } var normalBorderWidth = 1 set(value) { field = value requestLayout() } var activeBorderWidth = 1 set(value) { field = value requestLayout() } var normalBorderColor = Color.TRANSPARENT set(value) { field = value requestLayout() } var activeBorderColor = Color.TRANSPARENT set(value) { field = value requestLayout() } var emptyRectColor = Color.TRANSPARENT set(value) { field = value requestLayout() } var valueRectColor = Color.TRANSPARENT set(value) { field = value requestLayout() } var digitTextSize = 20f set(value) { field = value digitBoxes.forEach { it.setTextSize(TypedValue.COMPLEX_UNIT_PX, value) } } var digitTextColor = Color.BLACK set(value) { field = value digitBoxes.forEach { it.setTextColor(value) } } var digitTextStyle = 0 set(value) { field = value digitBoxes.forEach { it.typeface = when (digitTextStyle) { 1 -> Typeface.DEFAULT_BOLD else -> Typeface.DEFAULT } } } // 隐藏的EditText用于接收输入 private lateinit var hiddenEditText: EditText private val digitBoxes: MutableList<DigitBox> = mutableListOf() private var onInputCompleteListener: ((String) -> Unit)? = null private var onInputChangeListener: ((String) -> Unit)? = null init { attrs?.let { val typedArray = context.obtainStyledAttributes(it, R.styleable.InputNumberView) value = typedArray.getString(R.styleable.InputNumberView_value) digitCount = typedArray.getInt(R.styleable.InputNumberView_digitCount, digitCount) rectWidth = typedArray.getDimensionPixelSize( R.styleable.InputNumberView_rectWidth, rectWidth ) rectHeight = typedArray.getDimensionPixelSize( R.styleable.InputNumberView_rectHeight, rectHeight ) rectRadius = typedArray.getDimensionPixelSize( R.styleable.InputNumberView_rectRadius, rectRadius ) normalBorderWidth = typedArray.getDimensionPixelSize( R.styleable.InputNumberView_normalBorderWidth, normalBorderWidth ) activeBorderWidth = typedArray.getDimensionPixelSize( R.styleable.InputNumberView_activeBorderWidth, activeBorderWidth ) normalBorderColor = typedArray.getColor( R.styleable.InputNumberView_normalBorderColor, normalBorderColor ) activeBorderColor = typedArray.getColor( R.styleable.InputNumberView_activeBorderColor, activeBorderColor ) emptyRectColor = typedArray.getColor( R.styleable.InputNumberView_emptyRectColor, emptyRectColor ) valueRectColor = typedArray.getColor( R.styleable.InputNumberView_valueRectColor, valueRectColor ) digitTextSize = typedArray.getDimensionPixelSize( R.styleable.InputNumberView_digitTextSize, digitTextSize.toInt() ).toFloat() digitTextColor = typedArray.getColor( R.styleable.InputNumberView_digitTextColor, digitTextColor ) digitTextStyle = typedArray.getInt( R.styleable.InputNumberView_digitTextStyle, digitTextStyle ) typedArray.recycle() } setupView() } private fun setupView() { removeAllViews() // 创建隐藏的EditText hiddenEditText = EditText(context).apply { isClickable = true isFocusable = true layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) inputType = InputType.TYPE_CLASS_NUMBER filters = arrayOf(InputFilter.LengthFilter(digitCount)) setKeyListener(DigitsKeyListener.getInstance("0123456789")) isCursorVisible = false setBackgroundColor(Color.TRANSPARENT) setTextColor(Color.TRANSPARENT) // 输入监听 addTextChangedListener { val currentText = it?.toString() ?: "" updateDigitBoxes() onInputChangeListener?.invoke(currentText) if (currentText.length == digitCount) { onInputCompleteListener?.invoke(currentText) } } } addView(hiddenEditText) digitBoxes.clear() val group = LinearLayout(context).apply { gravity = Gravity.CENTER orientation = LinearLayout.HORIZONTAL layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) // 创建数字框 for (i in 0 until digitCount) { val digitBox = DigitBox(context).apply { layoutParams = LinearLayout.LayoutParams(rectWidth, rectHeight) } addView(digitBox) digitBoxes.add(digitBox) if (i < digitCount - 1) { addView(View(context).apply { layoutParams = LinearLayout.LayoutParams(0, 1, 1f) }) } } } addView(group) hiddenEditText.setText(value) if (!value.isNullOrEmpty()) { hiddenEditText.setSelection(value!!.length) } // 初始聚焦 hiddenEditText.postDelayed(Runnable { hiddenEditText.requestFocus() val imm = hiddenEditText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.showSoftInput(hiddenEditText, InputMethodManager.SHOW_IMPLICIT) }, 500) } /** * 清空输入 */ fun clear() { hiddenEditText.text?.clear() } /** * 设置输入完成监听 */ fun setOnInputCompleteListener(listener: (String) -> Unit) { this.onInputCompleteListener = listener } /** * 设置输入变化监听 */ fun setOnInputChangeListener(listener: (String) -> Unit) { this.onInputChangeListener = listener } /** * 更新数字框显示 */ private fun updateDigitBoxes() { val text = hiddenEditText.text?.toString() ?: "" for (i in 0 until digitCount) { digitBoxes[i].also { it.text = text.elementAtOrNull(i)?.toString() it.setActive(i == text.length) } } } /** * 数字框控件 */ private inner class DigitBox(context: Context) : AppCompatTextView(context) { private var isActive = false private val borderPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.STROKE } private val rect = RectF(0f, 0f, 0f, 0f) private val backgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL } private val cursorPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { strokeWidth = 2f.extDpToPx(context) strokeCap = Paint.Cap.ROUND } private val blinkDuration = 1200L // 闪烁周期(毫秒) private val blinkAnimator = ValueAnimator.ofInt(0, 255, 0).apply { duration = blinkDuration repeatCount = ValueAnimator.INFINITE repeatMode = ValueAnimator.RESTART addUpdateListener { animator -> val alpha = animator.animatedValue as Int cursorPaint.color = Color.argb( alpha, Color.red(digitTextColor), Color.green(digitTextColor), Color.blue(digitTextColor) ) invalidate() } } init { gravity = Gravity.CENTER setTextSize(TypedValue.COMPLEX_UNIT_PX, digitTextSize) setTextColor(digitTextColor) typeface = when (digitTextStyle) { 1 -> Typeface.DEFAULT_BOLD else -> Typeface.DEFAULT } } fun setActive(active: Boolean) { this.isActive = active startCursorAnimate() } //开始光标动画 private fun startCursorAnimate() { if (!isActive) { if (blinkAnimator.isRunning) { blinkAnimator.cancel() } return } if (!blinkAnimator.isRunning) { blinkAnimator.start() } } override fun onDraw(canvas: Canvas) { rect.apply { right = width.toFloat() bottom = height.toFloat() } // 绘制背景 backgroundPaint.apply { color = if (text.isNullOrEmpty()) emptyRectColor else valueRectColor } canvas.drawRoundRect( rect, rectRadius.toFloat(), rectRadius.toFloat(), backgroundPaint ) // 绘制边框 borderPaint.apply { color = if (isActive) activeBorderColor else normalBorderColor strokeWidth = if (isActive) activeBorderWidth.toFloat() else normalBorderWidth.toFloat() } canvas.drawRoundRect(rect, rectRadius.toFloat(), rectRadius.toFloat(), borderPaint) // 绘制光标 if (isActive && text.isNullOrEmpty()) { val centerX = width / 2f val centerY = height / 2f val cursorHeight = height * 0.4f canvas.drawLine( centerX, centerY - cursorHeight / 2, centerX, centerY + cursorHeight / 2, cursorPaint ) } super.onDraw(canvas) } } } app/src/main/res/drawable/circle_994a4c59_bg.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="@color/black_994A4C59" /> </shape> app/src/main/res/drawable/shape_1ad33233_bg_4.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/color_1ad33233" /> <corners android:radius="4dp" /> </shape> app/src/main/res/drawable/shape_d9d9d9_line_4.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="4dp"/> <stroke android:color="@color/bg_gray_dfd9d9" android:width="1dp"/> </shape> app/src/main/res/drawable/shape_ffe1e1_bg_30.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/color_ffe1e1" /> <corners android:radius="30dp" /> </shape> app/src/main/res/layout/activity_add_city_order2.xml
@@ -1,303 +1,470 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" 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" android:background="#F3F4F5"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > android:layout_width="0dp" android:layout_height="0dp" android:layout_marginBottom="20dp" app:layout_constraintBottom_toTopOf="@id/tv_action" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <androidx.constraintlayout.widget.ConstraintLayout <LinearLayout android:layout_width="match_parent" android:background="@drawable/bg_white_10" android:layout_height="wrap_content" android:background="@color/white" android:orientation="vertical" android:padding="16dp"> <LinearLayout android:id="@+id/ll_start_end_city" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/tv_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/text_gray_car" android:textSize="16sp" android:textStyle="bold" tools:text="遵义" /> <ImageView android:layout_width="24dp" android:layout_height="24dp" android:layout_marginHorizontal="18dp" android:src="@mipmap/icon_arrow_circle_red" /> <TextView android:id="@+id/tv_end" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/text_gray_car" android:textSize="16sp" android:textStyle="bold" tools:text="正安" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="14dp" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/tv_car_no" android:layout_width="wrap_content" android:layout_height="30dp" android:background="@drawable/shape_1ad33233_bg_4" android:gravity="center" android:paddingHorizontal="8dp" android:textColor="@color/text_gray_car" android:textSize="16sp" android:textStyle="bold" tools:text="川A 89Q91" /> <View android:layout_width="3dp" android:layout_height="3dp" android:layout_marginHorizontal="8dp" android:background="@drawable/circle_994a4c59_bg" /> <TextView android:id="@+id/tv_sex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/text_gray_car" android:textSize="13sp" android:textStyle="bold" tools:text="男师傅" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_date" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/black_666666" android:textSize="12sp" tools:text="出发日期:2026-09-09" /> <TextView android:id="@+id/tv_time" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="end" android:textColor="@color/black_666666" android:textSize="12sp" tools:text="出发时间:12:30" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="10dp" android:layout_marginHorizontal="10dp" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/path" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/tv_start" app:layout_constraintBottom_toBottomOf="@id/tv_start" app:layout_constraintEnd_toEndOf="parent" android:id="@+id/center" /> android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal" android:paddingHorizontal="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_start" android:textSize="19sp" android:textColor="@color/textColor" android:textStyle="bold" android:text="起点" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/center" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="14dp" android:drawablePadding="5dp" android:drawableStart="@drawable/bg_point_main_color"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_end" android:textSize="19sp" android:textColor="@color/textColor" android:textStyle="bold" android:text="终点" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/center" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="14dp" android:drawablePadding="5dp" android:drawableStart="@drawable/bg_point_end"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_unit" android:textColor="@color/red_deep" app:layout_constraintTop_toBottomOf="@id/tv_start" android:layout_marginTop="18dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="20dp" android:textStyle="bold" android:textSize="18sp" android:text="0.00"/> <TextView android:layout_width="match_parent" android:layout_height="24dp" app:layout_constraintBaseline_toBaselineOf="@id/tv_unit" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="14dp" android:gravity="center_vertical" android:paddingHorizontal="10dp" android:textColor="@color/textColor" android:text="出发地" android:textColor="@color/black_333333" android:textSize="14sp" android:textStyle="bold" android:id="@+id/tv_time" tools:text="12月23日 06:00-12:00" android:background="@drawable/bg_gradiant_gray_h"/> <View android:layout_width="20dp" android:layout_height="20dp" android:id="@+id/v1" app:layout_constraintTop_toBottomOf="@id/tv_unit" android:layout_marginStart="-15dp" app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="7dp" android:background="@drawable/bg_gray_10"/> <View android:layout_width="20dp" android:layout_height="20dp" android:id="@+id/v2" app:layout_constraintTop_toBottomOf="@id/tv_unit" android:layout_marginEnd="-15dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="7dp" android:background="@drawable/bg_gray_10"/> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@color/dividing_line_color" android:layout_marginTop="16dp" android:layout_marginHorizontal="20dp" app:layout_constraintTop_toBottomOf="@id/tv_unit"/> android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_1" android:text="乘车人数" android:textColor="@color/textColor" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/v1" android:layout_marginTop="10dp" android:layout_marginStart="14dp" app:layout_constraintStart_toStartOf="parent" android:textSize="16sp"/> <androidx.recyclerview.widget.RecyclerView android:layout_width="match_parent" android:layout_height="52dp" android:id="@+id/rv_seat" android:layout_marginHorizontal="10dp" app:layout_constraintTop_toBottomOf="@id/tv_1" android:layout_marginTop="14dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_2" android:text="乘车手机号" android:textColor="@color/textColor" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/rv_seat" android:layout_marginTop="20dp" android:layout_marginStart="14dp" app:layout_constraintStart_toStartOf="parent" android:textSize="16sp"/> <EditText android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/et_phone" app:layout_constraintTop_toBottomOf="@id/tv_2" android:layout_margin="14dp" android:gravity="center_vertical" android:paddingHorizontal="16dp" android:maxLength="11" android:inputType="number" android:textColor="@color/textColor" android:textSize="14sp" android:textStyle="bold" android:background="@drawable/bg_gray_11"/> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@color/dividing_line_color" app:layout_constraintTop_toBottomOf="@id/et_phone" android:layout_marginTop="20dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_3" android:text="上车点" android:textColor="@color/textColor" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/et_phone" android:layout_marginTop="40dp" android:layout_marginStart="14dp" app:layout_constraintStart_toStartOf="parent" android:textSize="16sp"/> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/tv_start_point" app:layout_constraintTop_toBottomOf="@id/tv_3" android:layout_margin="14dp" android:gravity="center_vertical" android:paddingHorizontal="16dp" android:textColor="@color/textColor" android:textSize="14sp" android:textStyle="bold" android:drawableEnd="@mipmap/more_gray" android:background="@drawable/bg_gray_11"/> android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="40dp" android:layout_marginEnd="13dp" android:layout_weight="1" android:gravity="center_vertical|end" android:hint="请选择出发地" android:singleLine="true" android:textColor="@color/black" android:textColorHint="@color/black4" android:textSize="14sp" /> <ImageView android:layout_width="6dp" android:layout_height="11dp" android:src="@mipmap/more_black" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="1dp" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal" android:paddingHorizontal="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_4" android:text="下车点" android:textColor="@color/textColor" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/tv_start_point" android:layout_marginTop="20dp" android:layout_marginStart="14dp" app:layout_constraintStart_toStartOf="parent" android:textSize="16sp"/> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/tv_end_point" app:layout_constraintTop_toBottomOf="@id/tv_4" android:layout_margin="14dp" android:gravity="center_vertical" android:paddingHorizontal="16dp" android:textColor="@color/textColor" android:text="目的地" android:textColor="@color/black_333333" android:textSize="14sp" android:textStyle="bold" android:drawableEnd="@mipmap/more_gray" android:background="@drawable/bg_gray_11"/> android:textStyle="bold" /> <TextView android:id="@+id/tv_end_point" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="40dp" android:layout_marginEnd="13dp" android:layout_weight="1" android:gravity="center_vertical|end" android:hint="请选择目的地" android:singleLine="true" android:textColor="@color/black" android:textColorHint="@color/black4" android:textSize="14sp" /> <ImageView android:layout_width="6dp" android:layout_height="11dp" android:src="@mipmap/more_black" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="10dp" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal" android:paddingHorizontal="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="乘车人联系电话" android:textColor="@color/black_333333" android:textSize="14sp" android:textStyle="bold" /> <EditText android:id="@+id/et_phone" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" android:gravity="center_vertical|end" android:hint="请输入联系电话" android:inputType="number" android:maxLength="11" android:singleLine="true" android:textColor="@color/black" android:textColorHint="@color/black4" android:textSize="14sp" /> </LinearLayout> <LinearLayout android:id="@+id/ll_passengers_num" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="1dp" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal" android:paddingHorizontal="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="乘车人数" android:textColor="@color/black_333333" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_passengers_num" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginStart="40dp" android:layout_marginEnd="13dp" android:layout_weight="1" android:gravity="center_vertical|end" android:hint="请选择乘车人数" android:textColor="@color/black" android:textColorHint="@color/black4" android:textSize="14sp" /> <ImageView android:layout_width="6dp" android:layout_height="11dp" android:src="@mipmap/more_black" /> </LinearLayout> <LinearLayout android:id="@+id/ll_seat" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="1dp" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal" android:paddingHorizontal="16dp" android:visibility="gone" tools:visibility="visible"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选择座位" android:textColor="@color/black_333333" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_seat" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginStart="40dp" android:layout_marginEnd="13dp" android:layout_weight="1" android:gravity="center_vertical|end" android:hint="请选择座位" android:textColor="@color/black" android:textColorHint="@color/black4" android:textSize="14sp" /> <ImageView android:layout_width="6dp" android:layout_height="11dp" android:src="@mipmap/more_black" /> </LinearLayout> <LinearLayout android:id="@+id/ll_more_fee" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="1dp" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal" android:paddingHorizontal="16dp" android:visibility="gone" tools:visibility="visible"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="其他费用" android:textColor="@color/black_333333" android:textSize="14sp" android:textStyle="bold" /> <EditText android:id="@+id/et_more_fee" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" android:gravity="center_vertical|end" android:hint="请输入远程费、高速费、等待费等" android:inputType="number" android:maxLength="11" android:singleLine="true" android:textColor="@color/black" android:textColorHint="@color/black4" android:textSize="14sp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="32dp" android:text="订单金额" android:textColor="@color/black" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_had_change_price" android:layout_width="wrap_content" android:layout_height="20dp" android:layout_gravity="center_horizontal" android:layout_marginTop="4dp" android:background="@drawable/shape_ffe1e1_bg_30" android:gravity="center" android:paddingHorizontal="8dp" android:text="司机已修改金额" android:textColor="@color/main_yellow_shen" android:textSize="12sp" android:visibility="gone" tools:visibility="visible" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="4dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginEnd="11dp" android:text="-" android:textColor="@color/textColor" android:textSize="16sp" android:textColor="@color/main_yellow_shen" android:textSize="38sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_end_point" /> tools:text="¥78.00" /> <TextView android:id="@+id/tv_unit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="票价合计" android:textColor="@color/textColor" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/tv_end_point" android:layout_marginTop="20dp" android:layout_marginEnd="11dp" app:layout_constraintStart_toStartOf="@id/tv_1" android:textSize="16sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_5" android:text="其他费用" android:textColor="@color/textColor" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/tv_price" android:layout_marginTop="20dp" android:layout_marginStart="14dp" app:layout_constraintStart_toStartOf="parent" android:textSize="16sp"/> <EditText android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/et_more_fee" app:layout_constraintTop_toBottomOf="@id/tv_5" android:layout_margin="14dp" android:gravity="center_vertical" android:paddingHorizontal="16dp" android:textColor="@color/textColor" android:textSize="14sp" android:hint="请输入远程费、高速费、等待费等" android:textColorHint="@color/black_999999" android:inputType="numberDecimal" android:textStyle="bold" android:background="@drawable/bg_gray_11"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_total" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="19dp" android:layout_alignBaseline="@id/tv_price" android:layout_marginStart="10dp" android:layout_toEndOf="@id/tv_price" android:textColor="@color/red_deep" android:textSize="30sp" android:textSize="18sp" android:textStyle="bold" android:text="-" app:layout_constraintTop_toBottomOf="@id/et_more_fee"/> android:visibility="gone" tools:text="0.00" tools:visibility="visible" /> </RelativeLayout> <LinearLayout android:id="@+id/ll_edit_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="4dp" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:layout_width="16dp" android:layout_height="16dp" android:src="@mipmap/icon_pan_orange" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="费用合计" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="20dp" android:textSize="14sp" android:textColor="@color/textColor" app:layout_constraintTop_toBottomOf="@id/tv_total" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> android:layout_marginStart="4dp" android:text="修改订单金额" android:textColor="@color/color_fb692a" /> </LinearLayout> <TextView android:id="@+id/tv_action" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="立即下单" android:textColor="@color/white" android:textSize="16sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="32dp" android:text="费用合计" android:textColor="@color/black" android:textSize="14sp" android:textStyle="bold" android:layout_marginTop="30dp" android:layout_marginHorizontal="55dp" android:layout_marginBottom="30dp" android:background="@drawable/bg_gradiant_25"/> android:visibility="gone" tools:visibility="visible" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="4dp" android:visibility="gone" tools:visibility="visible"> <TextView android:id="@+id/tv_total" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="-" android:textColor="@color/main_yellow_shen" android:textSize="38sp" android:textStyle="bold" tools:text="¥78.00" /> </RelativeLayout> </LinearLayout> </ScrollView> <TextView android:id="@+id/tv_action" android:layout_width="0dp" android:layout_height="50dp" android:layout_marginHorizontal="56dp" android:layout_marginBottom="34dp" android:background="@drawable/car_get_start" android:gravity="center" android:text="确认发布" android:textColor="@color/white" android:textSize="16sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> app/src/main/res/layout/activity_change_price.xml
New file @@ -0,0 +1,102 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".ui.to_city.ChangePriceActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="60dp" android:text="系统计算金额" android:textColor="@color/black" android:textSize="14sp" /> <TextView android:id="@+id/tv_person_num" android:layout_width="wrap_content" android:layout_height="20dp" android:layout_marginTop="4dp" android:background="@drawable/shape_ffe1e1_bg_30" android:gravity="center" android:paddingHorizontal="8dp" android:textColor="@color/main_yellow_shen" android:textSize="12sp" tools:text="2人价" /> <TextView android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:textColor="@color/main_yellow_shen" android:textSize="38sp" android:textStyle="bold" tools:text="¥99.26" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="45dp" android:layout_marginTop="36dp" android:text="修改金额" android:textColor="@color/black_333333" android:textSize="14sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginHorizontal="45dp" android:layout_marginTop="4dp" android:background="@drawable/shape_d9d9d9_line_4" android:gravity="center" android:orientation="horizontal" android:paddingHorizontal="12dp"> <EditText android:id="@+id/et_price" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@null" android:digits="0123456789." android:gravity="center_vertical" android:hint="请输入金额" android:inputType="number" android:maxLength="6" android:singleLine="true" android:textColor="@color/black" android:textColorHint="@color/black10" android:textSize="14sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="元" android:textColor="@color/black11" android:textSize="14sp" /> </LinearLayout> <View android:layout_width="1dp" android:layout_height="0dp" android:layout_weight="1" /> <TextView android:id="@+id/tv_confirm" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginHorizontal="55dp" android:layout_marginBottom="34dp" android:background="@drawable/car_get_start" android:gravity="center" android:text="确认" android:textColor="@color/white" android:textSize="16sp" android:textStyle="bold" /> </LinearLayout> app/src/main/res/layout/dialog_add_city_route_line_success.xml
New file @@ -0,0 +1,110 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginStart="35dp" android:layout_marginEnd="35dp" android:background="@drawable/bg_white_round_5"> <ImageView android:id="@+id/view_hint_close_base" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:padding="20dp" android:src="@mipmap/icon_close" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="24dp" android:text="改派选择" android:textColor="@color/black_4A4C59" android:textSize="18sp" android:textStyle="bold" /> <LinearLayout android:id="@+id/ll_start_end_city" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_title" android:layout_centerHorizontal="true" android:layout_marginTop="28dp" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/tv_start_city" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/text_gray_car" android:textSize="16sp" android:textStyle="bold" tools:text="遵义" /> <ImageView android:layout_width="24dp" android:layout_height="24dp" android:layout_marginHorizontal="18dp" android:src="@mipmap/icon_arrow_circle_red" /> <TextView android:id="@+id/tv_destination_city" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/text_gray_car" android:textSize="16sp" android:textStyle="bold" tools:text="正安" /> </LinearLayout> <LinearLayout android:id="@+id/ll_start_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/ll_start_end_city" android:layout_centerHorizontal="true" android:layout_marginTop="22dp" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:layout_width="14dp" android:layout_height="14dp" android:src="@mipmap/icon_clock_gray" /> <TextView android:id="@+id/tv_start_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:textColor="@color/black_666666" android:textSize="14sp" tools:text="出发时间:2026-09-09 11:0" /> </LinearLayout> <TextView android:id="@+id/tv_confirm" android:layout_width="match_parent" android:layout_height="50dp" android:layout_below="@id/ll_start_time" android:layout_marginHorizontal="20dp" android:layout_marginTop="48dp" android:layout_marginBottom="20dp" android:background="@drawable/car_get_start" android:gravity="center" android:text="确认" android:textColor="@color/white" android:textSize="16sp" android:textStyle="bold" /> </RelativeLayout> </RelativeLayout> app/src/main/res/layout/dialog_input_number.xml
New file @@ -0,0 +1,42 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginHorizontal="35dp" android:background="@drawable/bg_white_round_5" android:orientation="vertical"> <TextView android:id="@+id/tv_input_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="36dp" android:text="请输入客户手机后4位" android:textColor="@color/black" android:textSize="18sp" android:textStyle="" /> <cn.ptaxi.yuekeduocx.driver.ui.widget.InputNumberView android:id="@+id/inv_number" android:layout_width="match_parent" android:layout_height="59dp" android:layout_marginHorizontal="24dp" android:layout_marginVertical="36dp" app:digitCount="4" app:digitTextColor="@color/black" app:digitTextSize="24sp" app:digitTextStyle="bold" app:emptyRectColor="@color/color_f4f5f9" app:rectHeight="59dp" app:rectRadius="8dp" app:rectWidth="56dp" app:valueRectColor="@color/color_f4f5f9" /> </LinearLayout> </RelativeLayout> app/src/main/res/layout/item_main_list.xml
@@ -254,19 +254,6 @@ android:layout_toStartOf="@id/tv_cancel" android:background="@drawable/bg_login" android:paddingHorizontal="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="乘客支付" android:layout_marginEnd="10dp" android:paddingVertical="6dp" android:textSize="14sp" android:id="@+id/tv_qr" android:visibility="gone" android:textColor="@color/white" android:layout_toStartOf="@id/tv_pay" android:background="@drawable/bg_login" android:paddingHorizontal="10dp"/> </RelativeLayout> </LinearLayout> app/src/main/res/mipmap-xxhdpi/icon_pan_orange.png
app/src/main/res/values/attrs.xml
@@ -37,32 +37,32 @@ </declare-styleable> <declare-styleable name="TextBannerViewStyle"> <attr name="setInterval" format="integer|reference"/> <attr name="setAnimDuration" format="integer|reference"/> <attr name="setTextSize" format="dimension|reference"/> <attr name="setTextColor" format="color|reference"/> <attr name="setSingleLine" format="boolean"/> <attr name="setInterval" format="integer|reference" /> <attr name="setAnimDuration" format="integer|reference" /> <attr name="setTextSize" format="dimension|reference" /> <attr name="setTextColor" format="color|reference" /> <attr name="setSingleLine" format="boolean" /> <attr name="setFlags"> <enum name="strike" value="0"/> <enum name="underline" value="1"/> <enum name="strike" value="0" /> <enum name="underline" value="1" /> </attr> <attr name="setGravity"> <enum name="left" value="0"/> <enum name="center" value="1"/> <enum name="right" value="2"/> <enum name="left" value="0" /> <enum name="center" value="1" /> <enum name="right" value="2" /> </attr> <attr name="setDirection"> <enum name="bottom_to_top" value="0"/> <enum name="top_to_bottom" value="1"/> <enum name="right_to_left" value="2"/> <enum name="left_to_right" value="3"/> <enum name="bottom_to_top" value="0" /> <enum name="top_to_bottom" value="1" /> <enum name="right_to_left" value="2" /> <enum name="left_to_right" value="3" /> </attr> <attr name="setTypeface"> <enum name="normal" value="0"/> <enum name="bold" value="1"/> <enum name="italic" value="2"/> <enum name="italic_bold" value="3"/> <enum name="normal" value="0" /> <enum name="bold" value="1" /> <enum name="italic" value="2" /> <enum name="italic_bold" value="3" /> </attr> </declare-styleable> @@ -73,16 +73,16 @@ <declare-styleable name="WaveSideBar"> <attr name="sidebar_lazy_respond" format="boolean"/> <attr name="sidebar_text_color" format="color"/> <attr name="sidebar_max_offset" format="dimension"/> <attr name="sidebar_lazy_respond" format="boolean" /> <attr name="sidebar_text_color" format="color" /> <attr name="sidebar_max_offset" format="dimension" /> <attr name="sidebar_position" format="enum"> <enum name="right" value="0"/> <enum name="left" value="1"/> <enum name="right" value="0" /> <enum name="left" value="1" /> </attr> <attr name="sidebar_text_alignment" format="enum"> <enum name="center" value="0"/> <enum name="left" value="1"/> <enum name="center" value="0" /> <enum name="left" value="1" /> <enum name="right" value="2" /> </attr> </declare-styleable> @@ -96,4 +96,23 @@ <attr name="progFirstColor" format="color" /> <!--进度圆环结束颜色--> <attr name="progress" format="integer" /> <!--圆环进度--> </declare-styleable> <declare-styleable name="InputNumberView"> <attr name="value" format="string" /> <attr name="digitCount" format="integer" /> <attr name="rectWidth" format="dimension" /> <attr name="rectHeight" format="dimension" /> <attr name="rectRadius" format="dimension" /> <attr name="normalBorderWidth" format="dimension" /> <attr name="activeBorderWidth" format="dimension" /> <attr name="normalBorderColor" format="color" /> <attr name="activeBorderColor" format="color" /> <attr name="emptyRectColor" format="color" /> <attr name="valueRectColor" format="color" /> <attr name="digitTextSize" format="dimension" /> <attr name="digitTextColor" format="color" /> <attr name="digitTextStyle"> <flag name="normal" value="0" /> <flag name="bold" value="1" /> </attr> </declare-styleable> </resources> app/src/main/res/values/colors.xml
@@ -37,10 +37,13 @@ <color name="black3">#4D000000</color> <color name="black35">#59000000</color> <color name="black1">#15000000</color> <color name="black10">#40000000</color> <color name="black11">#d9000000</color> <color name="black_333333">#333333</color><!--黑色 --> <color name="black_666666">#666666</color><!--黑色 --> <color name="black_999999">#999999</color><!--黑色 --> <color name="black_4A4C59">#4A4C59</color><!--黑色 --> <color name="black_994A4C59">#994A4C59</color><!--黑色 --> <color name="write">#FFFFFF</color> <color name="write_10">#1AFFFFFF</color> @@ -121,4 +124,8 @@ <color name="color_f07207">#F07207</color> <color name="color_f0f0f6">#f0f0f6</color> <color name="color_ececec">#ececec</color> <color name="color_1ad33233">#1ad33233</color> <color name="color_fb692a">#fb692a</color> <color name="color_ffe1e1">#ffe1e1</color> <color name="color_f4f5f9">#f4f5f9</color> </resources>