如何在EditText输入过程中自动添加单位功能


前言

        Editext控件用于输入和修改文本的用户界面元素,我们定义R.styleable.TextView_inputType属性可以限制Editext的输入数据类型。一般你可以选择使用单个值或者多个值用“|”进行分割。例如你需要一个输入身高体重的输入框提供给用户则只需要将inputType属性设置为“number|numberDecimal”,这样你就可以在输入框中限制用户只输入数字和小数点了。

一、在XML中设置一个EditText

 <EditText
            android:id="@+id/height_edittext"
            android:paddingEnd="15dp"
            android:background="@color/white"
            android:hint="请输入身高"
            android:enabled="false"
            android:textSize="14sp"
            android:inputType="number|numberDecimal"
            android:gravity="right|center_vertical"
            android:lines="1"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toRightOf="@+id/height_text"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:textColor="#FF7D7D7D"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            tools:ignore="RtlHardcoded,RtlSymmetry" />

二、添加editText的文本输入监听

 val editText = findViewById<EditText>(R.id.height_edittext)
        editText.addTextChangedListener(object :TextWatcher{
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                TODO("Not yet implemented")
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                TODO("Not yet implemented")
            }

            override fun afterTextChanged(s: Editable?) {
                TODO("Not yet implemented")
            }
        })

三、afterTextChanged中处理单位

        先创建一个需要设置的单位变量,在afterTextChanged方法中我们先判断输入内容是否为空,当输入的内容不为空并且输入的内容和我们的单位内容是一样的 则将editText 设置为空内容。

//先创建一个heightUnit变量 内容是你需要添加的单位
private val heightUnit = "cm"

val editText = findViewById<EditText>(R.id.height_edittext)
editText.addTextChangedListener(object :TextWatcher{
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

    }

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

    }

    override fun afterTextChanged(inputContent: Editable?) {
        if (inputContent != null) {
            editText.removeTextChangedListener(this) //暂时移除输入监听避免死循环
            if (inputContent.toString().trim() == heightUnit) {
                editText.setText("")
            } else {

            }
        }
    }
})

   接下来判断内容不仅仅是单位的情况,我们需要先判断输入的内容光标位置,如果光标位置在内容的最后则我们主动将光标位置移动到单位前内容后的位置。

 val editText = findViewById<EditText>(R.id.height_edittext)
        editText.addTextChangedListener(object :TextWatcher{
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

            }

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

            }

            override fun afterTextChanged(inputContent: Editable?) {
                if (inputContent != null) {
                    editText.removeTextChangedListener(this) //移除输入监听,避免陷入死循环
                    if (inputContent.toString().trim() == heightUnit) {
                        //当此时内容是单位的时候,将edittext置为空
                        editText.setText("")
                    } else {
                        var ss = inputContent.toString()
                        //判断光标的位置
                        val len = ss.length - heightUnit.length
                        if (len >0 && ss.substring(ss.length - heightUnit.length,ss.length) == heightUnit){
                            //单位就在最后不处理
                        }else {
                            //当用户将光标置到单位后面时,输入的内容就会在单位后面,此时将前面的单位去掉,将单位放到最后
                            ss = ss.replace(heightUnit, "") + heightUnit
                            editText.setText(ss)
                        }
                    }
                }
            }
        })

 最后我们再将光标的位置重新设置并且将移除的监听重新添加进来就可以了,下面是完整代码

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.text.Selection
import android.text.TextWatcher
import android.widget.EditText

class MainActivity : AppCompatActivity() {
    private val heightUnit = "cm"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initEditText()
    }

    private fun initEditText() {
        val editText = findViewById<EditText>(R.id.height_edittext)
        editText.addTextChangedListener(object :TextWatcher{
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

            }

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

            }

            override fun afterTextChanged(inputContent: Editable?) {
                if (inputContent != null) {
                    editText.removeTextChangedListener(this) //移除输入监听,避免陷入死循环
                    if (inputContent.toString().trim() == heightUnit) {
                        //当此时内容是单位的时候,将edittext置为空
                        editText.setText("")
                    } else {
                        var ss = inputContent.toString()
                        //辅助判断单位存不存在/存在的位置
                        val len = ss.length - heightUnit.length
                        if (len >0 && ss.substring(ss.length - heightUnit.length,ss.length) == heightUnit){
                            //单位就在最后不处理
                        }else {
                            //当用户自己将光标置到单位后面时,输入的内容就会在单位后面,此时将前面的单位去掉,将单位放到最后
                            ss = ss.replace(heightUnit, "") + heightUnit
                            editText.setText(ss)
                            //这里得到光标应该在的位置(单位前面)
                            val index= ss.length - heightUnit.length
                            //设置光标的位置
                            Selection.setSelection(editText.text, if (index<0) 0 else index)
                        }
                        //重新进行监听
                        editText.addTextChangedListener(this)
                    }
                }
            }
        })
    }
}

  这个需求并不难,关键是处理好输入过程中的判断逻辑。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: EditTextAndroid的一个UI组件,用于接收和显示用户输入的文本信息。它提供了一系列方法用于操作和获取EditText的属性,其一些常用的方法如下: 1. setText(CharSequence text):设置EditText显示的文本内容。 2. getText():获取EditText的文本内容。 3. setHint(CharSequence hint):设置EditText输入内容时的提示信息。 4. setSelection(int index):设置EditText光标所在的位置。 5. addTextChangedListener(TextWatcher watcher):为EditText添加文本变化的监听器。 6. setOnEditorActionListener(TextView.OnEditorActionListener listener):为EditText设置编辑器操作的监听器。 7. setEnabled(boolean enabled):设置EditText是否可用。 以上仅是一部分常用的方法,EditText还有很多其他的方法可以使用。 ### 回答2: EditTextAndroid开发常用的一个控件,主要用于接收用户的输入。 1. getText():获取EditText的文本内容 方法说明:返回一个Editable类型的对象,表示EditText的文本内容 2. setText():设置EditText的文本内容 方法说明:接收一个CharSequence类型的参数,并将其作为EditText的文本内容进行显示 3. setSelection():设置EditText文本的选区域 方法说明:接收两个参数,分别表示选文本的起始位置和结束位置,将这段文本在EditText变为选状态 4. append():在EditText的内容后追加文本 方法说明:接收一个CharSequence类型的参数,并将其追加到EditText原有的文本内容后面 5. addTextChangedListener():为EditText添加文本变化监听器 方法说明:接收一个TextWatcher类型的参数,用于监听EditText文本内容的变化 6. setHint():设置EditText的提示文本 方法说明:接收一个CharSequence类型的参数,用于设置EditText的提示文本,在用户输入之前显示在控件上 7. setInputType():设置EditText输入类型 方法说明:接收一个InputType类型的参数,用于设置EditText接收用户输入的类型,如数字、电话、邮箱等 8. requestFocus():获取EditText焦点 方法说明:设置EditText为焦点状态,允许用户输入的控件会自动获取焦点 9. setEnabled():设置EditText是否可编辑 方法说明:接收一个boolean类型的参数,用于设置EditText是否可以编辑。当设置为false时,EditText将无法接收用户的输入。 以上是EditText的一些常用方法和简单的文说明,通过这些方法,可以实现对EditText的各种操作和设置。 ### 回答3: EditTextAndroid开发常用的一个控件,用于接收和显示用户输入的文本。下面是EditText的常用方法及其文说明: 1. setText(CharSequence text):设置EditText显示的文本内容。 2. getText():获取EditText当前显示的文本内容。 3. setHint(CharSequence hint):设置EditText的提示文本,当EditText没有输入时显示。 4. setEnabled(boolean enabled):设置EditText是否可用。 5. setFocusable(boolean focusable):设置EditText是否可以获得焦点。 6. setFocusableInTouchMode(boolean focusableInTouchMode):设置EditText是否可以在触摸模式下获得焦点。 7. addTextChangedListener(TextWatcher watcher):添加文本监听器,用于监听EditText文本的变化。 8. setSelection(int index):设置EditText文本的选范围。 9. setCursorVisible(boolean visible):设置是否显示光标。 10. setInputType(int type):设置EditText输入类型,例如数字、电话号码、密码等。 11. setTransformationMethod(TransformationMethod method):设置EditText文本的转换方式,例如隐藏密码。 12. setOnEditorActionListener(TextView.OnEditorActionListener listener):设置监听EditText软键盘的动作事件。 13. setFilters(InputFilter[] filters):设置输入过滤器,限制输入字符的类型和长度。 14. setError(CharSequence error):设置错误提示信息,当用户输入不符合要求时显示错误提示。 15. setOnFocusChangeListener(View.OnFocusChangeListener listener):设置焦点改变监听器,用于监听EditText的焦点变化。 16. requestFocus():请求EditText获取焦点。 这些方法可以帮助我们控制和自定义EditText的行为和外观,使其能够更好地满足我们的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值