refactor: 国际出港查询筛选改内嵌面板并对齐国际进港交互
- 筛选由XPopup全屏抽屉改为内嵌滑动面板,不再遮挡标题栏 - 有筛选条件时筛选按钮显示红点(hasFilter) - 航班号锁定大写字母数字、目的港锁定大写字母 - 运单类型走字典接口(type=IO 国际出港),修正原错误的"10" - 修复PadDataLayoutNew重置后Spinner UI未清空(国际进港同组件一并修复) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -719,7 +719,7 @@ XxxDialogModel(onConfirm = { refresh() }).show()
|
|||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
| 底部 | `DIALOG_TYPE_BOTTOM` | 操作选项 | 默认类型 |
|
| 底部 | `DIALOG_TYPE_BOTTOM` | 操作选项 | 默认类型 |
|
||||||
| 中间 | `DIALOG_TYPE_CENTER` | 确认框、表单输入 | `ConfirmDialogModel` |
|
| 中间 | `DIALOG_TYPE_CENTER` | 确认框、表单输入 | `ConfirmDialogModel` |
|
||||||
| 抽屉 | `DIALOG_TYPE_DRAWER` | 筛选条件 | `GjcQueryFilterDialogModel` |
|
| 抽屉 | `DIALOG_TYPE_DRAWER` | 通用右侧抽屉 | 见下方模板 |
|
||||||
| 全屏 | `DIALOG_TYPE_FULL` | 列表展示 | `NoticeMessageDialogModel` |
|
| 全屏 | `DIALOG_TYPE_FULL` | 列表展示 | `NoticeMessageDialogModel` |
|
||||||
|
|
||||||
### 抽屉弹窗(筛选场景)
|
### 抽屉弹窗(筛选场景)
|
||||||
|
|||||||
@@ -278,7 +278,8 @@ class PadDataLayoutNew : FrameLayout {
|
|||||||
|
|
||||||
tvSpinner.text = list.find { b -> b.value == value }?.key ?: value
|
tvSpinner.text = list.find { b -> b.value == value }?.key ?: value
|
||||||
|
|
||||||
if (value.isNotEmpty() && list.isNotEmpty()) {
|
// 同步 Spinner 选中项(含 value 为空时重置到对应项,如"全部"),修复重置后 UI 不清空的问题
|
||||||
|
if (list.isNotEmpty()) {
|
||||||
val index = list.indexOfFirst { b -> b.value == value }
|
val index = list.indexOfFirst { b -> b.value == value }
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
spinner.post {
|
spinner.post {
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package com.lukouguoji.gjc.activity
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.FrameLayout
|
||||||
import com.alibaba.android.arouter.facade.annotation.Route
|
import com.alibaba.android.arouter.facade.annotation.Route
|
||||||
import com.lukouguoji.gjc.R
|
import com.lukouguoji.gjc.R
|
||||||
import com.lukouguoji.gjc.databinding.ActivityGjcQueryBinding
|
import com.lukouguoji.gjc.databinding.ActivityGjcQueryBinding
|
||||||
@@ -12,6 +15,8 @@ import com.lukouguoji.module_base.common.ConstantEvent
|
|||||||
import com.lukouguoji.module_base.impl.FlowBus
|
import com.lukouguoji.module_base.impl.FlowBus
|
||||||
import com.lukouguoji.module_base.impl.observe
|
import com.lukouguoji.module_base.impl.observe
|
||||||
import com.lukouguoji.module_base.ktx.getLifecycleOwner
|
import com.lukouguoji.module_base.ktx.getLifecycleOwner
|
||||||
|
import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter
|
||||||
|
import com.lukouguoji.module_base.ktx.setUpperCaseLetterFilter
|
||||||
import com.lukouguoji.module_base.router.ARouterConstants
|
import com.lukouguoji.module_base.router.ARouterConstants
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,13 +44,74 @@ class GjcQueryActivity :
|
|||||||
viewModel.refresh()
|
viewModel.refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化代理列表
|
// 初始化代理列表 & 筛选下拉列表
|
||||||
viewModel.initAgentList()
|
viewModel.initAgentList()
|
||||||
|
viewModel.initFilterLists()
|
||||||
|
|
||||||
|
// 观察筛选面板显示状态
|
||||||
|
viewModel.filterVisible.observe(this) { visible ->
|
||||||
|
if (visible) showFilterPanel() else hideFilterPanel()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 航班号:大写字母+数字
|
||||||
|
binding.filterPanel.filterFlightNo.et.setUpperCaseAlphanumericFilter()
|
||||||
|
// 目的港:仅大写字母
|
||||||
|
binding.filterPanel.filterDest.et.setUpperCaseLetterFilter()
|
||||||
|
|
||||||
// 初始加载
|
// 初始加载
|
||||||
viewModel.refresh()
|
viewModel.refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun showFilterPanel() {
|
||||||
|
val panel = binding.filterPanel.root
|
||||||
|
val overlay = binding.filterOverlay
|
||||||
|
val panelWidth = window.decorView.width / 3
|
||||||
|
|
||||||
|
panel.layoutParams = (panel.layoutParams as FrameLayout.LayoutParams).apply {
|
||||||
|
width = panelWidth
|
||||||
|
gravity = Gravity.END
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先 INVISIBLE 完成测量,避免第一次显示时闪烁
|
||||||
|
panel.visibility = View.INVISIBLE
|
||||||
|
panel.translationX = panelWidth.toFloat()
|
||||||
|
overlay.visibility = View.VISIBLE
|
||||||
|
overlay.alpha = 0f
|
||||||
|
|
||||||
|
panel.post {
|
||||||
|
panel.visibility = View.VISIBLE
|
||||||
|
panel.animate().translationX(0f).setDuration(250).start()
|
||||||
|
overlay.animate().alpha(1f).setDuration(250).start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hideFilterPanel() {
|
||||||
|
val panel = binding.filterPanel.root
|
||||||
|
val overlay = binding.filterOverlay
|
||||||
|
|
||||||
|
if (panel.visibility != View.VISIBLE) return
|
||||||
|
|
||||||
|
panel.animate()
|
||||||
|
.translationX(panel.width.toFloat())
|
||||||
|
.setDuration(250)
|
||||||
|
.withEndAction { panel.visibility = View.GONE }
|
||||||
|
.start()
|
||||||
|
|
||||||
|
overlay.animate()
|
||||||
|
.alpha(0f)
|
||||||
|
.setDuration(250)
|
||||||
|
.withEndAction { overlay.visibility = View.GONE }
|
||||||
|
.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBackPressed() {
|
||||||
|
if (viewModel.filterVisible.value == true) {
|
||||||
|
viewModel.closeFilter()
|
||||||
|
} else {
|
||||||
|
super.onBackPressed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun start(context: Context) {
|
fun start(context: Context) {
|
||||||
|
|||||||
@@ -1,101 +0,0 @@
|
|||||||
package com.lukouguoji.gjc.dialog
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.res.ColorStateList
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.view.View
|
|
||||||
import android.widget.ImageView
|
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import com.lukouguoji.gjc.R
|
|
||||||
import com.lukouguoji.gjc.databinding.DialogGjcQueryFilterBinding
|
|
||||||
import com.lukouguoji.module_base.base.BaseDialogModel
|
|
||||||
import com.lxj.xpopup.XPopup
|
|
||||||
import com.lxj.xpopup.enums.PopupPosition
|
|
||||||
import dev.DevUtils
|
|
||||||
import dev.utils.app.info.KeyValue
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 国际出港查询筛选抽屉
|
|
||||||
*/
|
|
||||||
class GjcQueryFilterDialogModel(
|
|
||||||
val spCode: MutableLiveData<String>, // 特码
|
|
||||||
val flightNo: MutableLiveData<String>, // 航班号
|
|
||||||
val dest: MutableLiveData<String>, // 目的港
|
|
||||||
val awbType: MutableLiveData<String>, // 运单类型
|
|
||||||
val businessType: MutableLiveData<String>, // 业务类型
|
|
||||||
val goodsCn: MutableLiveData<String>, // 品名(中)
|
|
||||||
private val onConfirm: () -> Unit
|
|
||||||
) : BaseDialogModel<DialogGjcQueryFilterBinding>(DIALOG_TYPE_DRAWER) {
|
|
||||||
|
|
||||||
// 运单类型列表
|
|
||||||
val awbTypeList = MutableLiveData(
|
|
||||||
listOf(
|
|
||||||
KeyValue("全部", ""),
|
|
||||||
KeyValue("主单", "1"),
|
|
||||||
KeyValue("分单", "2")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
// 业务类型列表
|
|
||||||
val businessTypeList = MutableLiveData(
|
|
||||||
listOf(
|
|
||||||
KeyValue("全部", ""),
|
|
||||||
KeyValue("普货", "1"),
|
|
||||||
KeyValue("特货", "2")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun layoutId() = R.layout.dialog_gjc_query_filter
|
|
||||||
|
|
||||||
override fun onBuild(builder: XPopup.Builder) {
|
|
||||||
super.onBuild(builder)
|
|
||||||
// 设置从右边弹出
|
|
||||||
builder.popupPosition(PopupPosition.Right)
|
|
||||||
|
|
||||||
// 设置抽屉宽度为 Activity contentView 宽度的1/3(横屏长边)
|
|
||||||
val activity = DevUtils.getTopActivity()
|
|
||||||
val activityWidth = activity.window.decorView.width
|
|
||||||
builder.maxWidth(activityWidth / 3)
|
|
||||||
builder.popupWidth(activityWidth / 3)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDialogCreated(context: Context) {
|
|
||||||
binding.model = this
|
|
||||||
binding.lifecycleOwner = context as? androidx.lifecycle.LifecycleOwner
|
|
||||||
|
|
||||||
val titleColor = Color.parseColor("#666666")
|
|
||||||
|
|
||||||
// 设置标题
|
|
||||||
binding.root.findViewById<TextView>(R.id.title_name)?.text = "筛选条件"
|
|
||||||
binding.root.findViewById<TextView>(R.id.title_name)?.setTextColor(titleColor)
|
|
||||||
binding.root.findViewById<TextView>(R.id.tool_tv_back)?.setTextColor(titleColor)
|
|
||||||
binding.root.findViewById<ImageView>(R.id.tool_iv_back)?.imageTintList = ColorStateList.valueOf(titleColor)
|
|
||||||
binding.root.findViewById<View>(R.id.toolbar)?.setBackgroundColor(Color.WHITE)
|
|
||||||
|
|
||||||
// 返回按钮
|
|
||||||
binding.root.findViewById<View>(R.id.tool_back)?.setOnClickListener {
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 重置筛选条件
|
|
||||||
*/
|
|
||||||
fun onResetClick() {
|
|
||||||
spCode.value = ""
|
|
||||||
flightNo.value = ""
|
|
||||||
dest.value = ""
|
|
||||||
awbType.value = ""
|
|
||||||
businessType.value = ""
|
|
||||||
goodsCn.value = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 确认筛选
|
|
||||||
*/
|
|
||||||
fun onConfirmClick() {
|
|
||||||
dismiss()
|
|
||||||
onConfirm()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,9 +2,9 @@ package com.lukouguoji.gjc.viewModel
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import androidx.lifecycle.MediatorLiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import com.lukouguoji.gjc.R
|
import com.lukouguoji.gjc.R
|
||||||
import com.lukouguoji.gjc.dialog.GjcQueryFilterDialogModel
|
|
||||||
import com.lukouguoji.gjc.holder.GjcQueryViewHolder
|
import com.lukouguoji.gjc.holder.GjcQueryViewHolder
|
||||||
import com.lukouguoji.module_base.base.BasePageViewModel
|
import com.lukouguoji.module_base.base.BasePageViewModel
|
||||||
import com.lukouguoji.module_base.common.Constant
|
import com.lukouguoji.module_base.common.Constant
|
||||||
@@ -14,6 +14,7 @@ import com.lukouguoji.module_base.ktx.launchLoadingCollect
|
|||||||
import com.lukouguoji.module_base.ktx.showToast
|
import com.lukouguoji.module_base.ktx.showToast
|
||||||
import com.lukouguoji.module_base.ktx.toRequestBody
|
import com.lukouguoji.module_base.ktx.toRequestBody
|
||||||
import com.lukouguoji.module_base.model.ScanModel
|
import com.lukouguoji.module_base.model.ScanModel
|
||||||
|
import com.lukouguoji.module_base.util.DictUtils
|
||||||
import dev.utils.app.info.KeyValue
|
import dev.utils.app.info.KeyValue
|
||||||
import dev.utils.common.DateUtils
|
import dev.utils.common.DateUtils
|
||||||
import com.lukouguoji.module_base.ktx.formatDate
|
import com.lukouguoji.module_base.ktx.formatDate
|
||||||
@@ -52,7 +53,22 @@ class GjcQueryViewModel : BasePageViewModel() {
|
|||||||
val totalPc = MutableLiveData("0") // 总件数
|
val totalPc = MutableLiveData("0") // 总件数
|
||||||
val totalWeight = MutableLiveData("0") // 总重量
|
val totalWeight = MutableLiveData("0") // 总重量
|
||||||
|
|
||||||
// ==================== 筛选条件(预留)====================
|
// ==================== 筛选面板 ====================
|
||||||
|
val filterVisible = MutableLiveData(false)
|
||||||
|
|
||||||
|
// 运单类型列表(字典接口 typeCode/awb,type=IO 国际出港)
|
||||||
|
val awbTypeList = MutableLiveData<List<KeyValue>>(emptyList())
|
||||||
|
|
||||||
|
// 业务类型列表
|
||||||
|
val businessTypeList = MutableLiveData(
|
||||||
|
listOf(
|
||||||
|
KeyValue("全部", ""),
|
||||||
|
KeyValue("普货", "1"),
|
||||||
|
KeyValue("特货", "2")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
// ==================== 筛选条件 ====================
|
||||||
val spCode = MutableLiveData("") // 特码
|
val spCode = MutableLiveData("") // 特码
|
||||||
val flightNo = MutableLiveData("") // 航班号
|
val flightNo = MutableLiveData("") // 航班号
|
||||||
val dest = MutableLiveData("") // 目的港
|
val dest = MutableLiveData("") // 目的港
|
||||||
@@ -60,6 +76,20 @@ class GjcQueryViewModel : BasePageViewModel() {
|
|||||||
val businessType = MutableLiveData("") // 业务类型
|
val businessType = MutableLiveData("") // 业务类型
|
||||||
val goodsCn = MutableLiveData("") // 品名(中)
|
val goodsCn = MutableLiveData("") // 品名(中)
|
||||||
|
|
||||||
|
// 是否有筛选条件(任意一个非空则为 true,用于筛选按钮红点)
|
||||||
|
val hasFilter: MediatorLiveData<Boolean> = MediatorLiveData<Boolean>().apply {
|
||||||
|
val update = { _: Any? ->
|
||||||
|
value = listOf(spCode, flightNo, dest, awbType, businessType, goodsCn)
|
||||||
|
.any { !it.value.isNullOrEmpty() }
|
||||||
|
}
|
||||||
|
addSource(spCode, update)
|
||||||
|
addSource(flightNo, update)
|
||||||
|
addSource(dest, update)
|
||||||
|
addSource(awbType, update)
|
||||||
|
addSource(businessType, update)
|
||||||
|
addSource(goodsCn, update)
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// 方法区
|
// 方法区
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
@@ -79,19 +109,50 @@ class GjcQueryViewModel : BasePageViewModel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 筛选按钮点击
|
* 筛选按钮点击 - 打开筛选面板
|
||||||
*/
|
*/
|
||||||
fun filterClick() {
|
fun filterClick() {
|
||||||
val filterDialog = GjcQueryFilterDialogModel(
|
filterVisible.value = true
|
||||||
spCode = spCode,
|
}
|
||||||
flightNo = flightNo,
|
|
||||||
dest = dest,
|
/**
|
||||||
awbType = awbType,
|
* 关闭筛选面板
|
||||||
businessType = businessType,
|
*/
|
||||||
goodsCn = goodsCn,
|
fun closeFilter() {
|
||||||
onConfirm = { refresh() }
|
filterVisible.value = false
|
||||||
)
|
}
|
||||||
filterDialog.show()
|
|
||||||
|
/**
|
||||||
|
* 重置筛选条件
|
||||||
|
*/
|
||||||
|
fun resetFilter() {
|
||||||
|
spCode.value = ""
|
||||||
|
flightNo.value = ""
|
||||||
|
dest.value = ""
|
||||||
|
awbType.value = ""
|
||||||
|
businessType.value = ""
|
||||||
|
goodsCn.value = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认筛选 - 关闭面板并刷新
|
||||||
|
*/
|
||||||
|
fun confirmFilter() {
|
||||||
|
filterVisible.value = false
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化筛选下拉列表(运单类型从字典接口获取,type=IO 国际出港)
|
||||||
|
*/
|
||||||
|
fun initFilterLists() {
|
||||||
|
DictUtils.getWaybillTypeList(
|
||||||
|
type = Constant.businessType.IO,
|
||||||
|
addAll = true,
|
||||||
|
checkedValue = awbType.value
|
||||||
|
) {
|
||||||
|
awbTypeList.postValue(it)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -110,7 +171,7 @@ class GjcQueryViewModel : BasePageViewModel() {
|
|||||||
"wbNo" to waybillNo.value!!.ifEmpty { null },
|
"wbNo" to waybillNo.value!!.ifEmpty { null },
|
||||||
// 筛选条件(暂未使用)
|
// 筛选条件(暂未使用)
|
||||||
"spCode" to spCode.value!!.ifEmpty { null },
|
"spCode" to spCode.value!!.ifEmpty { null },
|
||||||
"flightNo" to flightNo.value!!.ifEmpty { null },
|
"fno" to flightNo.value!!.ifEmpty { null },
|
||||||
"dest" to dest.value!!.ifEmpty { null },
|
"dest" to dest.value!!.ifEmpty { null },
|
||||||
"awbType" to awbType.value!!.ifEmpty { null },
|
"awbType" to awbType.value!!.ifEmpty { null },
|
||||||
"businessType" to businessType.value!!.ifEmpty { null },
|
"businessType" to businessType.value!!.ifEmpty { null },
|
||||||
@@ -126,7 +187,7 @@ class GjcQueryViewModel : BasePageViewModel() {
|
|||||||
"wbNo" to waybillNo.value!!.ifEmpty { null },
|
"wbNo" to waybillNo.value!!.ifEmpty { null },
|
||||||
// 筛选条件
|
// 筛选条件
|
||||||
"spCode" to spCode.value!!.ifEmpty { null },
|
"spCode" to spCode.value!!.ifEmpty { null },
|
||||||
"flightNo" to flightNo.value!!.ifEmpty { null },
|
"fno" to flightNo.value!!.ifEmpty { null },
|
||||||
"dest" to dest.value!!.ifEmpty { null },
|
"dest" to dest.value!!.ifEmpty { null },
|
||||||
"awbType" to awbType.value!!.ifEmpty { null },
|
"awbType" to awbType.value!!.ifEmpty { null },
|
||||||
"businessType" to businessType.value!!.ifEmpty { null },
|
"businessType" to businessType.value!!.ifEmpty { null },
|
||||||
|
|||||||
5
module_gjc/src/main/res/drawable/bg_red_dot.xml
Normal file
5
module_gjc/src/main/res/drawable/bg_red_dot.xml
Normal 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="#F44336" />
|
||||||
|
</shape>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<data>
|
<data>
|
||||||
|
<import type="android.view.View" />
|
||||||
<import type="com.lukouguoji.module_base.ui.weight.search.layout.SearchLayoutType" />
|
<import type="com.lukouguoji.module_base.ui.weight.search.layout.SearchLayoutType" />
|
||||||
|
|
||||||
<variable
|
<variable
|
||||||
@@ -18,9 +18,21 @@
|
|||||||
android:background="@color/color_f2"
|
android:background="@color/color_f2"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<!-- 标题栏 -->
|
<!-- 标题栏(始终在最上层,不被遮挡) -->
|
||||||
<include layout="@layout/title_tool_bar" />
|
<include layout="@layout/title_tool_bar" />
|
||||||
|
|
||||||
|
<!-- 内容区域(FrameLayout 包裹,筛选面板和遮罩只在此区域内) -->
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1">
|
||||||
|
|
||||||
|
<!-- 原有内容 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
<!-- 搜索区域 -->
|
<!-- 搜索区域 -->
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -104,15 +116,28 @@
|
|||||||
android:padding="2dp"
|
android:padding="2dp"
|
||||||
android:src="@drawable/img_search" />
|
android:src="@drawable/img_search" />
|
||||||
|
|
||||||
<!-- 筛选按钮 -->
|
<!-- 筛选按钮(含红点) -->
|
||||||
<ImageView
|
<FrameLayout
|
||||||
android:layout_width="36dp"
|
android:layout_width="36dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="36dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginLeft="16dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
android:onClick="@{()-> viewModel.filterClick()}"
|
android:onClick="@{()-> viewModel.filterClick()}"
|
||||||
android:padding="5dp"
|
android:padding="5dp"
|
||||||
android:src="@drawable/img_filter" />
|
android:src="@drawable/img_filter" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="8dp"
|
||||||
|
android:layout_height="8dp"
|
||||||
|
android:layout_gravity="top|end"
|
||||||
|
android:background="@drawable/bg_red_dot"
|
||||||
|
android:visibility="@{viewModel.hasFilter ? View.VISIBLE : View.GONE}" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
@@ -184,4 +209,29 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- 遮罩层(只覆盖内容区域) -->
|
||||||
|
<View
|
||||||
|
android:id="@+id/filter_overlay"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#80000000"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:onClick="@{()-> viewModel.closeFilter()}"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<!-- 筛选面板(从右侧滑入,只在内容区域内) -->
|
||||||
|
<include
|
||||||
|
android:id="@+id/filter_panel"
|
||||||
|
layout="@layout/layout_gjc_query_filter"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:viewModel="@{viewModel}" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
</layout>
|
</layout>
|
||||||
|
|||||||
@@ -2,32 +2,47 @@
|
|||||||
<layout xmlns:android="http://schemas.android.com/apk/res/android">
|
<layout xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<data>
|
<data>
|
||||||
|
|
||||||
<import type="com.lukouguoji.module_base.ui.weight.data.layout.DataLayoutType" />
|
<import type="com.lukouguoji.module_base.ui.weight.data.layout.DataLayoutType" />
|
||||||
|
|
||||||
<variable
|
<variable
|
||||||
name="model"
|
name="viewModel"
|
||||||
type="com.lukouguoji.gjc.dialog.GjcQueryFilterDialogModel" />
|
type="com.lukouguoji.gjc.viewModel.GjcQueryViewModel" />
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="@color/white"
|
android:background="@color/white"
|
||||||
|
android:elevation="8dp"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<!-- 状态栏占位 -->
|
<!-- 筛选标题栏 -->
|
||||||
<View
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="25dp"
|
android:layout_height="50dp"
|
||||||
android:background="@color/white" />
|
android:gravity="center_vertical"
|
||||||
|
android:paddingHorizontal="15dp">
|
||||||
|
|
||||||
<!-- 标题栏 -->
|
<ImageView
|
||||||
<include layout="@layout/title_tool_bar" />
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:onClick="@{()-> viewModel.closeFilter()}"
|
||||||
|
android:src="@mipmap/left_icon"
|
||||||
|
android:tint="#666666" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:text="筛选条件"
|
||||||
|
android:textColor="#666666"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<com.google.android.material.divider.MaterialDivider
|
<com.google.android.material.divider.MaterialDivider
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1dp"/>
|
android:layout_height="1dp" />
|
||||||
|
|
||||||
<!-- 筛选条件区域 -->
|
<!-- 筛选条件区域 -->
|
||||||
<ScrollView
|
<ScrollView
|
||||||
@@ -43,71 +58,73 @@
|
|||||||
|
|
||||||
<!-- 特码 -->
|
<!-- 特码 -->
|
||||||
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
hint='@{"请输入特码"}'
|
hint='@{"请输入特码"}'
|
||||||
title='@{"特码"}'
|
title='@{"特码"}'
|
||||||
titleLength="@{4}"
|
titleLength="@{4}"
|
||||||
type="@{DataLayoutType.INPUT}"
|
type="@{DataLayoutType.INPUT}"
|
||||||
value='@={model.spCode}'
|
value='@={viewModel.spCode}' />
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp" />
|
|
||||||
|
|
||||||
<!-- 航班号 -->
|
<!-- 航班号 -->
|
||||||
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
||||||
|
android:id="@+id/filter_flight_no"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
hint='@{"请输入航班号"}'
|
hint='@{"请输入航班号"}'
|
||||||
title='@{"航班号"}'
|
title='@{"航班号"}'
|
||||||
titleLength="@{4}"
|
titleLength="@{4}"
|
||||||
type="@{DataLayoutType.INPUT}"
|
type="@{DataLayoutType.INPUT}"
|
||||||
value='@={model.flightNo}'
|
value='@={viewModel.flightNo}' />
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp" />
|
|
||||||
|
|
||||||
<!-- 目的港 -->
|
<!-- 目的港 -->
|
||||||
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
||||||
|
android:id="@+id/filter_dest"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
hint='@{"请输入目的港"}'
|
hint='@{"请输入目的港"}'
|
||||||
title='@{"目的港"}'
|
title='@{"目的港"}'
|
||||||
titleLength="@{4}"
|
titleLength="@{4}"
|
||||||
type="@{DataLayoutType.INPUT}"
|
type="@{DataLayoutType.INPUT}"
|
||||||
value='@={model.dest}'
|
value='@={viewModel.dest}' />
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp" />
|
|
||||||
|
|
||||||
<!-- 运单类型 -->
|
<!-- 运单类型 -->
|
||||||
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
hint='@{"请选择运单类型"}'
|
hint='@{"请选择运单类型"}'
|
||||||
list="@{model.awbTypeList}"
|
list="@{viewModel.awbTypeList}"
|
||||||
title='@{"运单类型"}'
|
title='@{"运单类型"}'
|
||||||
titleLength="@{4}"
|
titleLength="@{4}"
|
||||||
type="@{DataLayoutType.SPINNER}"
|
type="@{DataLayoutType.SPINNER}"
|
||||||
value='@={model.awbType}'
|
value='@={viewModel.awbType}' />
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp" />
|
|
||||||
|
|
||||||
<!-- 业务类型 -->
|
<!-- 业务类型 -->
|
||||||
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
hint='@{"请选择业务类型"}'
|
hint='@{"请选择业务类型"}'
|
||||||
list="@{model.businessTypeList}"
|
list="@{viewModel.businessTypeList}"
|
||||||
title='@{"业务类型"}'
|
title='@{"业务类型"}'
|
||||||
titleLength="@{4}"
|
titleLength="@{4}"
|
||||||
type="@{DataLayoutType.SPINNER}"
|
type="@{DataLayoutType.SPINNER}"
|
||||||
value='@={model.businessType}'
|
value='@={viewModel.businessType}' />
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp" />
|
|
||||||
|
|
||||||
<!-- 品名(中) -->
|
<!-- 品名(中) -->
|
||||||
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
hint='@{"请输入品名"}'
|
hint='@{"请输入品名"}'
|
||||||
title='@{"品名(中)"}'
|
title='@{"品名(中)"}'
|
||||||
titleLength="@{4}"
|
titleLength="@{4}"
|
||||||
type="@{DataLayoutType.INPUT}"
|
type="@{DataLayoutType.INPUT}"
|
||||||
value='@={model.goodsCn}'
|
value='@={viewModel.goodsCn}' />
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp" />
|
|
||||||
|
|
||||||
<!-- 底部按钮区域 -->
|
<!-- 底部按钮区域 -->
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@@ -120,7 +137,6 @@
|
|||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:paddingHorizontal="15dp">
|
android:paddingHorizontal="15dp">
|
||||||
|
|
||||||
<!-- 重置按钮 -->
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
@@ -128,19 +144,18 @@
|
|||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:background="@drawable/bg_primary_radius_4"
|
android:background="@drawable/bg_primary_radius_4"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:onClick="@{()-> model.onResetClick()}"
|
android:onClick="@{()-> viewModel.resetFilter()}"
|
||||||
android:text="重置"
|
android:text="重置"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:textSize="16sp" />
|
android:textSize="16sp" />
|
||||||
|
|
||||||
<!-- 搜索按钮 -->
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:background="@drawable/bg_primary_radius_4"
|
android:background="@drawable/bg_primary_radius_4"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:onClick="@{()-> model.onConfirmClick()}"
|
android:onClick="@{()-> viewModel.confirmFilter()}"
|
||||||
android:text="搜索"
|
android:text="搜索"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:textSize="16sp" />
|
android:textSize="16sp" />
|
||||||
@@ -149,10 +164,8 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</layout>
|
</layout>
|
||||||
Reference in New Issue
Block a user