Edittext在用戶完全輸入完成之後,進行計算給當前edittext賦值等操作

今天遇到一需求,商品加入到採購單裏面的問題

增加數量時,商品包含最少起訂量(如最少買10個)

點擊加減都是以10爲單位加減,

輸入框輸入數量時,沒有輸入是的整數時,變爲向下最近十的整數。

開始我把計算方式放在了onTextChanged 和afterTextChanged
沒有用 mHandler.postDelayed(mRunnable, 800)
沒輸入一位,都回去計算,導致永遠是0,
還有一種情況就是賦值後,檢測到變化,繼續賦值,陷入死循環中,

下方爲正確的解決方法:

此計算放在edittext用戶輸入完畢後

			mHandler.removeCallbacks(mRunnable);
            //800毫秒沒有輸入認爲輸入完畢  計算入最少起訂量是10  輸入19 向下取整 10
            mHandler.postDelayed(mRunnable, 800)

			//計算完成後,給edittext賦值
 val mHandler = object : Handler() {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            if (1 === msg.what) {
                var num = if (etNum.text.isNullOrEmpty()) 0 else Integer.valueOf(etNum.text.toString().trim())
                var num1 = Math.abs(num / minCount) * minCount
                if (minCount > 1 && num != num1) {
                        num = Math.abs(num / minCount) * minCount
                        etNum.setText("$num")
                        etNum.setSelection(etNum.text.length)
                }

            }

        }
    }
    val mRunnable = Runnable { mHandler.sendEmptyMessage(1) }

需要給Edittext添加監聽,
editext.addTextChangedListener(watcher)
// 輸入框內容監聽
val watcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
          

            var num = if (etNum.text.isNullOrEmpty()) 0 else Integer.valueOf(etNum.text.toString().trim())
            if (num < 0) {
                etNum.setText("0")
                etNum.setSelection(etNum.text.length)
                num = 0
                ToastUtil.showCustomToast("不能在減少啦")
                tvSub.isEnabled = false
                tvAdd.isEnabled = true
            } else tvSub.isEnabled = true

            if (num > (data.actual_stock ?: 0) + (data.virtual_stock ?: 0)) {
                etNum.setText("${(data.actual_stock ?: 0) + (data.virtual_stock ?: 0)}")
                num = (data.actual_stock ?: 0) + (data.virtual_stock ?: 0)
                ToastUtil.showCustomToast("庫存不足")
                tvSub.isEnabled = true
                tvAdd.isEnabled = false
                etNum.setSelection(etNum.text.length)
            } else tvAdd.isEnabled = true


            mHandler.removeCallbacks(mRunnable);
            //800毫秒沒有輸入認爲輸入完畢  計算入最少起訂量是10  輸入19 向下取整 10
            mHandler.postDelayed(mRunnable, 800)
            data.selectCount = num
            onNumChanged?.onChanged(holder.adapterPosition, num)

            //邏輯結束後,在加入監聽
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章