美文网首页
为EditText添加千位逗号分割

为EditText添加千位逗号分割

作者: sometimes_ | 来源:发表于2019-05-16 19:05 被阅读0次
    1558004600671_video.gif
    <declare-styleable name="StoreCostSetCell">
            <attr name="store_LeftTitle" format="string" />
            <attr name="store_RightMoney" format="string" />
    </declare-styleable>
    

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/parentView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true"
        android:paddingStart="16dp"
        android:paddingTop="20dp"
        android:paddingEnd="16dp"
        android:paddingBottom="20dp"
        tools:ignore="MissingDefaultResource">
    
        <TextView
            android:id="@+id/tvTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorTextBlack"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:text="门店月租金" />
    
        <EditText
            android:id="@+id/edMoney"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="50dp"
            android:background="@null"
            android:gravity="end"
            android:hint="¥请输入金额"
            android:inputType="number"
            android:textColor="@color/colorPrimary"
            android:textColorHint="#B2B7BE"
            android:textSize="18sp"
            app:layout_constraintBaseline_toBaselineOf="@+id/tvTitle"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/tvTitle" />
    
        <TextView
            android:id="@+id/tvUnit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="3dp"
            android:text="¥"
            android:textColor="@color/colorPrimary"
            android:textSize="14sp"
            android:visibility="gone"
            app:layout_constraintBaseline_toBaselineOf="@+id/tvTitle"
            app:layout_constraintEnd_toStartOf="@+id/edMoneyGone" />
    
    
        <EditText
            android:id="@+id/edMoneyGone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@null"
            android:clickable="false"
            android:focusable="false"
            android:longClickable="false"
            android:textColor="@color/colorPrimary"
            android:textSize="18sp"
            android:visibility="invisible"
            app:layout_constraintBaseline_toBaselineOf="@+id/tvTitle"
            app:layout_constraintEnd_toEndOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    代码实现

    /**
     * Created by liuqian on 2019/3/14 19:36
     * Describe:
     */
    class StoreCostSetCell @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) {
    
        private val view: View = LayoutInflater.from(context).inflate(R.layout.store_cell_cost_set, this)
        private val tvTitle: TextView
        private val edMoney: EditText
        private val tvUnit: TextView
        private val edMoneyGone: EditText  //不可见的那个edittext  用来控制单位的位置
    
        init {
            val a = context.obtainStyledAttributes(attrs, R.styleable.StoreCostSetCell)
            val tvLeftContent = a.getString(R.styleable.StoreCostSetCell_store_LeftTitle)
            val tvRightContent = a.getString(R.styleable.StoreCostSetCell_store_RightMoney)
            a.recycle()
            tvTitle = view.findViewById(R.id.tvTitle)
            edMoney = view.findViewById(R.id.edMoney)
            tvUnit = view.findViewById(R.id.tvUnit)
            edMoneyGone = view.findViewById(R.id.edMoneyGone)
            setListener()
            tvTitle.text = tvLeftContent
            edMoney.setText(tvRightContent)
        }
    
        private fun setEdHint(isShowHintConent: Boolean = true) {
            if (isShowHintConent)
                edMoney.hint = SpannableString("¥请输入金额").apply {
                    setSpan( //修改颜色
                            ForegroundColorSpan(Color.parseColor("#B2B7BE")),
                            0,
                            this.length,
                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
                    )
    
                    setSpan( //单位的大小
                            RelativeSizeSpan(0.78f),
                            0,
                            1,
                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
                    )
                }
            else edMoney.hint = ""
        }
    
        private fun setListener() {
            edMoney.setOnFocusChangeListener { _, hasFocus ->
                if (hasFocus) {
                    if (edMoney.length() == 0) {
                        setEdHint(false) //便显示hint
                        tvUnit.visibility = View.VISIBLE
                    }
                } else {
                    val content = edMoney.text.toString()
                    if (content.isNotEmpty()) { //有内容
                        tvUnit.visibility = View.VISIBLE
                    } else {
                        setEdHint(true) //显示hint
                        tvUnit.visibility = View.GONE
                    }
                }
            }
            edMoney.addTextChangedListener(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) {
                    //以下为加入分割逗号  千位分割
                    if (!edMoney.hasFocus()) return
                    val realString = s.toString().replace(",", "")
                    val stringBuild = StringBuilder() //保存变化的数据
                    if (realString.length > 3) { //大于 3 才会添加
                        //开始下标
                        var startAddIndex: Int = if (realString.length % 3 == 0) {
                            3
                        } else {
                            realString.length % 3
                        }
                        for (i in 0 until realString.length) {
    
                            if (startAddIndex == i) {
                                stringBuild.append(",")
                                startAddIndex += 3 //下一个添加逗号的下标
                            }
                            stringBuild.append(realString[i].toString())
    
                        }
    
                        if (stringBuild.toString() != s.toString()) {  //别进入死循环
                            edMoney.setText(stringBuild.toString())
                            edMoney.setSelection(edMoney.length())
                            edMoneyGone.text = edMoney.text
                        }
                    } else {
                        //此时可能会存在逗号  1,23
                        if (edMoney.text.toString() != realString) {
                            edMoney.setText(realString)
                            edMoney.setSelection(edMoney.length())
                        }
                        edMoneyGone.setText(realString)
                    }
                }
            })
        }
    
        private fun setRightContent(string: String) {
            edMoney.setText(string)
        }
    
        private fun getMoney(): String {
            return edMoney.text.toString().replace(",", "")
        }
    }
    

    相关文章

      网友评论

          本文标题:为EditText添加千位逗号分割

          本文链接:https://www.haomeiwen.com/subject/hkjwaqtx.html