diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
index 8f196bc..6308775 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -138,66 +138,78 @@
         vLastPayamtll = this.findViewById<LinearLayout>(R.id.ll_consume_last_payamt)
     }
 
-    private fun delValueToEdit() {
-        presenter.clickNoPay()
-        val str = amountTxt.text.toString()
-        val len = str.length
-        when {
-            len == 0 ||
-                    len == 1 -> {
-                refresh()
-            }
-            len > 1 -> {
-                amountTxt.text = str.substring(0, len - 1)
-                showScreenAmount()
-            }
-        }
+    override fun onStop() {
+        super.onStop()
+        isBackRuning = true
     }
 
-    private fun checkAmtToPay() {
-        amount = getCurAmount() + addAmount
-        if (amount > 0) {
-            amountTxt.text = String.format("%.02f", amount / 100.0f)
-            presenter.clickToPay(amount)
-            showDialogPay()
-        } else {
-            AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
-        }
+    override fun onDestroy() {
+        SoundUtil.releaseMusic()
+        presenter.stop()
+        beepManager!!.close()
+        super.onDestroy()
     }
 
-    private fun showDialogPay() {
-        dialogPurchase!!.codePaying = false
-        dialogPurchase!!.isFixPay = false
-        dialogPurchase!!.codePayingNoCancelEnable = false
-        dialogPurchase!!.show("请刷卡", CommonUtil.showFormatAmount("金额", amount))
-    }
-
-    private fun getCurAmount(): Int {
-        return try {
-            CommonUtil.YuanToFen(java.lang.Double.parseDouble(amountTxt.text.toString().trim { it <= ' ' }))
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-            0
-        }
-    }
-
-    private fun addValueToEdit(value: Int) {
-        var str = amountTxt.text.toString()
-        if ("0" == str) {
-            str = ""
-        }
-        //如果已经有小数点，则小数点后面不能超过两位
-        if (str.indexOf(".") > 0) {
-            if (str.length - str.indexOf(".") <= 2) {
-                amountTxt.text = "$str$value"
-            }
-        } else {
-            //限制消费金额<1000
-            if (str.length < 3) {
-                amountTxt.text = "$str$value"
+    @SuppressLint("SetTextI18n")
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            val keyCode = event.keyCode
+            when (keyCode) {
+                KeyEvent.KEYCODE_BACK -> {
+                    amountTxt.text = "0"
+                    presenter.clickNoPay()
+                }
+                KeyEvent.KEYCODE_0,
+                KeyEvent.KEYCODE_1,
+                KeyEvent.KEYCODE_2,
+                KeyEvent.KEYCODE_3,
+                KeyEvent.KEYCODE_4,
+                KeyEvent.KEYCODE_5,
+                KeyEvent.KEYCODE_6,
+                KeyEvent.KEYCODE_7,
+                KeyEvent.KEYCODE_8,
+                KeyEvent.KEYCODE_9 -> {
+                    presenter.clickNoPay()
+                    addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
+                }
+                KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
+                    presenter.clickNoPay()
+                    val str = amountTxt.text.toString()
+                    if (str.length < 8 && str.indexOf('.') < 0) {
+                        amountTxt.text = "$str."
+                        showScreenAmount()
+                    }
+                }
+                KeyEvent.KEYCODE_NUMPAD_ADD -> {
+                    //'+'
+                    addAmount += getCurAmount()
+                    amountTxt.text = ""
+                    showScreenAmount()
+                }
+                KeyEvent.KEYCODE_DPAD_LEFT -> {
+                    //'F1'
+                    isBackRuning = true
+                    jumpActivity(MenuActivity::class.java)
+                }
+//                KeyEvent.KEYCODE_DPAD_UP ->
+                //'F2'
+//                KeyEvent.KEYCODE_DPAD_DOWN ->
+                //'F3'
+                KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                    //'F4'
+                    jumpActivity(TransdtlActivity::class.java)
+                }
+                KeyEvent.KEYCODE_DEL -> {
+                    //cancel
+                    presenter.clickNoPay()
+                    delValueToEdit()
+                }
+                KeyEvent.KEYCODE_ENTER -> {
+                    checkAmtToPay()
+                }
             }
         }
-        showScreenAmount()
+        return super.dispatchKeyEvent(event)
     }
 
     override fun showUserInfo(info: CardUserInfoBean) {
@@ -406,6 +418,68 @@
         }
     }
 
+    private fun delValueToEdit() {
+        presenter.clickNoPay()
+        val str = amountTxt.text.toString()
+        val len = str.length
+        when {
+            len == 0 ||
+                    len == 1 -> {
+                refresh()
+            }
+            len > 1 -> {
+                amountTxt.text = str.substring(0, len - 1)
+                showScreenAmount()
+            }
+        }
+    }
+
+    private fun checkAmtToPay() {
+        amount = getCurAmount() + addAmount
+        if (amount > 0) {
+            amountTxt.text = String.format("%.02f", amount / 100.0f)
+            presenter.clickToPay(amount)
+            showDialogPay()
+        } else {
+            AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
+        }
+    }
+
+    private fun showDialogPay() {
+        dialogPurchase!!.codePaying = false
+        dialogPurchase!!.isFixPay = false
+        dialogPurchase!!.codePayingNoCancelEnable = false
+        dialogPurchase!!.show("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+    }
+
+    private fun getCurAmount(): Int {
+        return try {
+            CommonUtil.YuanToFen(java.lang.Double.parseDouble(amountTxt.text.toString().trim { it <= ' ' }))
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+            0
+        }
+    }
+
+    private fun addValueToEdit(value: Int) {
+        var str = amountTxt.text.toString()
+        if ("0" == str) {
+            str = ""
+        }
+        //如果已经有小数点，则小数点后面不能超过两位
+        if (str.indexOf(".") > 0) {
+            if (str.length - str.indexOf(".") <= 2) {
+                amountTxt.text = "$str$value"
+            }
+        } else {
+            //限制消费金额<1000
+            if (str.length < 3) {
+                amountTxt.text = "$str$value"
+            }
+        }
+        showScreenAmount()
+    }
+
     private fun clearLastPayResult() {
         vLastResult.text = null
         vLastPayamt.text = null
@@ -415,80 +489,6 @@
         vLastPayFailreason.text = null
     }
 
-    override fun onStop() {
-        super.onStop()
-        isBackRuning = true
-    }
-
-    override fun onDestroy() {
-        SoundUtil.releaseMusic()
-        presenter.stop()
-        beepManager!!.close()
-        super.onDestroy()
-    }
-
-    @SuppressLint("SetTextI18n")
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            val keyCode = event.keyCode
-            when (keyCode) {
-                KeyEvent.KEYCODE_BACK -> {
-                    amountTxt.text = "0"
-                    presenter.clickNoPay()
-                }
-                KeyEvent.KEYCODE_0,
-                KeyEvent.KEYCODE_1,
-                KeyEvent.KEYCODE_2,
-                KeyEvent.KEYCODE_3,
-                KeyEvent.KEYCODE_4,
-                KeyEvent.KEYCODE_5,
-                KeyEvent.KEYCODE_6,
-                KeyEvent.KEYCODE_7,
-                KeyEvent.KEYCODE_8,
-                KeyEvent.KEYCODE_9 -> {
-                    presenter.clickNoPay()
-                    addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
-                }
-                KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
-                    presenter.clickNoPay()
-                    val str = amountTxt.text.toString()
-                    if (str.length < 8 && str.indexOf('.') < 0) {
-                        amountTxt.text = "$str."
-                        showScreenAmount()
-                    }
-                }
-                KeyEvent.KEYCODE_NUMPAD_ADD -> {
-                    //'+'
-                    addAmount += getCurAmount()
-                    amountTxt.text = ""
-                    showScreenAmount()
-                }
-                KeyEvent.KEYCODE_DPAD_LEFT -> {
-                    //'F1'
-                    isBackRuning = true
-                    jumpActivity(MenuActivity::class.java)
-                }
-//                KeyEvent.KEYCODE_DPAD_UP ->
-                //'F2'
-//                KeyEvent.KEYCODE_DPAD_DOWN ->
-                //'F3'
-                KeyEvent.KEYCODE_DPAD_RIGHT -> {
-                    //'F4'
-                    jumpActivity(TransdtlActivity::class.java)
-                }
-                KeyEvent.KEYCODE_DEL -> {
-                    //cancel
-                    presenter.clickNoPay()
-                    delValueToEdit()
-                }
-                KeyEvent.KEYCODE_ENTER -> {
-                    checkAmtToPay()
-                }
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
     private fun showScreenAmount() {
         if (addAmount > 0) {
             AuxScreenController.getInstance().refreshContent(
@@ -510,10 +510,6 @@
         return isBackRuning
     }
 
-    fun showFixConsume(fixamt: Int) {
-        amountTxt.text = String.format("%.02f", fixamt / 100.0f)
-    }
-
     override fun showRecentDtl(record: TransdtlUnionRecord?) {
         if (record != null) {
             val info = CardUserInfoBean(PublicDef.SUCCESS, "")
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayConfirmRetBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayConfirmRetBean.kt
index d469a56..c879a8a 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayConfirmRetBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayConfirmRetBean.kt
@@ -9,7 +9,7 @@
 class CardPayConfirmRetBean : BaseResp() {
     var amount: Int = 0
     var extraamt: Int = 0
-    var balance: Int = 0
+    var balance: Int? = null
     var require_query: Boolean = false
 //    var username: String? = null
 //    var userid: Int = 0
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index f88e2b9..3972fe6 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
@@ -19,7 +19,6 @@
 import com.supwisdom.utils.GsonUtil
 import com.supwisdom.utils.PublicDef
 import org.apache.http.HttpStatus
-import java.lang.Exception
 
 /**
  ** create by zzq on 2019/7/25
@@ -102,16 +101,16 @@
                                 doConsume()
                             } catch (ex: CardPayFailError) {
                                 sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
-                                clickStat = ClickStat.INIT
                             }
+                            clickStat = ClickStat.INIT
                         }
                         ClickStat.REVERSE -> {
                             try {
                                 doReverse()
                             } catch (ex: CardPayCancelFailError) {
                                 sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getErrorInfo(ex.message))
-                                clickStat = ClickStat.INIT
                             }
+                            clickStat = ClickStat.INIT
                         }
                         ClickStat.INIT -> {
                             if (SPApplication.getInstance().isOnline() && !onlineBalance) {
diff --git a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
index b047f21..c20049a 100644
--- a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
@@ -1,10 +1,223 @@
 package com.supwisdom.activities.transdtl
 
+import android.os.AsyncTask
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.widget.TextView
+import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlUnionRecord
+import com.supwisdom.utils.DateUtil
+import java.util.*
 
 /**
  ** create by zzq on 2019/7/26
  ** @desc
  **/
 class TransdtlActivity : BaseActivity() {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vSeqno: TextView
+    private lateinit var vContent: TextView
+    private var isSearching: Boolean = false
+    @Volatile
+    private var keyActive = true
+    private val MAX_SEARCH_NUM = 19
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_transdtl)
+        initView()
+    }
+
+    private fun initView() {
+        vSeqno = findViewById<TextView>(R.id.transdtl_seqno)
+        vContent = findViewById<TextView>(R.id.transdtl_content)
+    }
+
+    private fun refresh() {
+        setShowSeqno(1)
+        doSearch(1)
+    }
+
+    private fun showCustomQuery(seqno: Int) {
+        AuxScreenController.getInstance().refreshTitle("流水记录查询")
+        AuxScreenController.getInstance().refreshBottom("F3/F4 切换记录")
+        AuxScreenController.getInstance()
+            .refreshContent(Arrays.asList<String>("流水索引号:$seqno", "正在查询", "请稍等...", " ", " ", " "))
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isSearching || !keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DPAD_UP -> {
+                }
+                KeyEvent.KEYCODE_DPAD_DOWN ->
+                    //F3
+                    movePreSeqno()
+                KeyEvent.KEYCODE_DPAD_RIGHT ->
+                    //F4
+                    moveNextSeqno()
+                KeyEvent.KEYCODE_DEL ->
+                    //cancel
+                    jumpActivity(ConsumeActivity::class.java)
+            }//F2
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun moveNextSeqno() {
+        var seqno = getShowSeqno()
+        if (seqno > MAX_SEARCH_NUM) {
+            return
+        }
+        seqno += 1
+        setShowSeqno(seqno)
+        doSearch(seqno)
+    }
+
+    private fun movePreSeqno() {
+        var seqno = getShowSeqno()
+        if (seqno > 1) {
+            seqno -= 1
+            setShowSeqno(seqno)
+            doSearch(seqno)
+        }
+    }
+
+    private fun doSearch(seqno: Int) {
+        isSearching = true
+        showCustomQuery(seqno)
+        queryTransdtl(seqno - 1)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        refresh()
+    }
+
+    fun showTransdtlResult(record: TransdtlUnionRecord?) {
+        isSearching = false
+        if (record == null) {
+            vContent.text = "未找到消费记录"
+            AuxScreenController.getInstance().refreshContent(
+                Arrays.asList<String>(
+                    "流水索引号:" + getShowSeqno(),
+                    "查询失败:", "未找到消费记录", " ", " ", " "
+                )
+            )
+        } else {
+            val transdatetime = StringBuilder()
+            transdatetime.append(record.transdate!!.substring(0, 4)).append("-")
+                .append(record.transdate!!.substring(4, 6)).append("-")
+                .append(record.transdate!!.substring(6)).append(" ")
+                .append(record.transtime!!.substring(0, 2)).append(":")
+                .append(record.transtime!!.substring(2, 4)).append(":")
+                .append(record.transtime!!.substring(4))
+            val result = if (record.status == PayStatus.SUC) {
+                if (record.reversalflag == ReversalFlag.AUTO ||
+                    record.reversalflag == ReversalFlag.MANUAL
+                ) {
+                    "已退款"
+                } else {
+                    "消费成功"
+                }
+            } else {
+                if (record.reversalflag == ReversalFlag.AUTO ||
+                    record.reversalflag == ReversalFlag.MANUAL
+                ) {
+                    "冲正失败"
+                } else {
+                    "消费失败"
+                }
+            }
+            val payWay = if (record.payway == "code") {
+                "二维码"
+            } else {
+                "市民卡"
+            }
+            val sb = StringBuilder("查询成功   \n")
+            sb.append("姓名: ").append(record.username).append("\n")
+                .append("支付方式: ").append(payWay).append("\n")
+                .append(String.format("支付金额: %.02f元", record.payamt / 100.0f)).append("\n")
+                .append("支付时间: ").append(transdatetime.toString()).append("\n")
+                .append("支付结果: ").append(result)
+            vContent.text = sb.toString()
+
+            AuxScreenController.getInstance().refreshContent(
+                Arrays.asList(
+                    "时间:$transdatetime",
+                    "姓名:" + record.username,
+                    String.format("金额:%.02f元", record.payamt / 100.0f),
+                    "方式:$payWay", "结果:$result"
+                )
+            )
+        }
+    }
+
+    private fun getShowSeqno(): Int {
+        return Integer.parseInt(vSeqno.text.toString())
+    }
+
+    private fun setShowSeqno(seqno: Int) {
+        vSeqno.text = seqno.toString()
+    }
+
+    private fun queryTransdtl(seqno: Int) {
+        AsyncTransdtl().execute(seqno)
+    }
+
+    private inner class AsyncTransdtl : AsyncTask<Int, Void, TransdtlUnionRecord?>() {
+        override fun onPostExecute(record: TransdtlUnionRecord?) {
+            showTransdtlResult(record)
+        }
+
+        override fun doInBackground(vararg integers: Int?): TransdtlUnionRecord? {
+            val searchSeqno = integers[0]!!
+            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), searchSeqno, 1, 1)
+            return if (list.isNotEmpty()) {
+                list[0]
+            } else {
+                null
+            }
+        }
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
index 1071836..683b689 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
@@ -51,25 +51,22 @@
         var cursor: Cursor? = null
         var sql = when (flag) {
             0 -> {
-                ("select * from ("
-                        + tablesql.toString()
-                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                (tablesql.toString()
+                        + " where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
                         + "' order by " + BeanPropEnum.TransdtlUnion.transtime
                         + " desc ")
             }
             1 -> {
-                ("select * from ("
-                        + tablesql.toString()
-                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                (tablesql.toString()
+                        + " where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
                         + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
                         + PayStatus.SUC.toString()
                         + "' order by " + BeanPropEnum.TransdtlUnion.transtime
                         + " desc ")
             }
             else -> {
-                ("select * from ("
-                        + tablesql.toString()
-                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                (tablesql.toString()
+                        + " where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
                         + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
                         + PayStatus.FAIL.toString()
                         + "' order by " + BeanPropEnum.TransdtlUnion.transtime
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
index 2345e92..97cfa84 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -16,7 +16,7 @@
     var payamt: Int = 0
     var extraamt: Int = 0
     var managefeetype: String? = null // none,discount,mealer
-    var balance: Int = 0
+    var balance: Int? = null
     var username: String? = null
     //    var userid: Int = 0
     var billno: String? = null
diff --git a/app/src/main/res/layout/activity_transdtl.xml b/app/src/main/res/layout/activity_transdtl.xml
new file mode 100644
index 0000000..0c44701
--- /dev/null
+++ b/app/src/main/res/layout/activity_transdtl.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/light_blue2"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="10dp"
+        android:background="@drawable/corner_bg_white"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:padding="20dp"
+            android:text="流水查询"
+            android:textColor="@color/light_blue2"
+            android:textSize="50sp" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="10dp"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="查询记录: "
+                android:textColor="@color/light_blue2"
+                android:textSize="30sp" />
+
+            <TextView
+                android:id="@+id/transdtl_seqno"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text=""
+                android:textColor="@color/light_blue2"
+                android:textSize="30sp" />
+        </LinearLayout>
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="10dp"
+            android:padding="10dp"
+            android:text="查询结果: "
+            android:textColor="@color/light_blue2"
+            android:textSize="30sp" />
+
+        <TextView
+            android:id="@+id/transdtl_content"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="10dp"
+            android:padding="10dp"
+            android:text=""
+            android:textColor="@color/light_blue2"
+            android:textSize="30sp" />
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
