Android EditText 获取/失去焦点

项目的需求中,又一个4位数的验证码界面,小弟才疏学浅,只想到了用线性布局里面放四个EditText

需求需要输入内容后,自动跳到下一个位置聚焦,删除指定位置后,自动跳到上一个位置聚焦,由于聚焦/非聚焦UI展示得都不同,所以每个editText都会频繁的设置焦点变化。

之前因为是调用的系统键盘,所以,editText和键盘绑定后处理起来非常方便,但是,我们需要自定义一个展示在UI上的数字键盘,于是就有些bug。

bug不难,但是有点杂乱,下面是我的一点解决办法,总结一下,以后也记得更清楚!

1、首先是实现输入内容后,自动跳到下一个位置聚焦:

实现方式:TextWatcher监听内容输入后,设置此位置失去焦点,下个位置获取焦点(由此控制UI变化)

var textWatcher: TextWatcher = 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(s: Editable) {
            if (!s.toString().isEmpty() && currentPosition < editTextList.size() - 1) {
                editTextList.get(currentPosition).setFocusable(false)
                //下个位置自动聚焦
                currentPosition++
                editTextList.get(currentPosition).setFocusable(true)
                editTextList.get(currentPosition).setFocusableInTouchMode(true)
                editTextList.get(currentPosition).requestFocus()
                editTextList.get(currentPosition).findFocus()
            }
        }
    }

tips:之前我只调用了requestFocus(),但是有概率会失败,因为我会在操作的过程中调用setFocusable(false),所以,稳妥的办法就是:

editTextList.get(currentPosition).setFocusable(true);//设置输入框可聚焦
editTextList.get(currentPosition).setFocusableInTouchMode(true);//设置触摸聚焦
editTextList.get(currentPosition).requestFocus();//请求聚焦
editTextList.get(currentPosition).findFocus();//获取焦点

2.删除内容后,设置为失去焦点,跳到有内容的位置,得到焦点

fun deleteContent() {
        editTextList.get(currentPosition).setText("")
        if (currentPosition > 0) {
            editTextList.get(currentPosition).setFocusable(false)
            editTextList.get(currentPosition)
                .setBackground(ContextCompat.getDrawable(context, R.drawable.rgb_282730_r12))
            //跳到前一个不为空的EditText
            for (position in currentPosition downTo 0) {
                currentPosition = position
                if (!editTextList.get(position).getText().toString().isEmpty()) {
                    isDelete = true
                    editTextList.get(currentPosition).setBackground(
                        ContextCompat.getDrawable(
                            context,
                            R.drawable.rgb272830_stroke_r12
                        )
                    )
                    editTextList.get(currentPosition).setFocusable(true)
                    editTextList.get(currentPosition).setFocusableInTouchMode(true)
                    editTextList.get(currentPosition).requestFocus()
                    editTextList.get(currentPosition).findFocus()
                    break
                }
            }
        }
    }

 3.这是焦点监听:为editText列表根据isFocused设置背景

var onFocusChangeListener =
        OnFocusChangeListener { v: View?, hasFocus: Boolean ->
            for (i in editTextList.indices) {
                if (editTextList.get(i).isFocused()) { 
                    currentPosition = ieditTextList.get(i).setBackground()
                } else { editTextList.get(i).setBackground() }
            }
        }

tips:

1. edittext禁止调出软键盘(之前用editText.setFocusable(false);这方法来实现点击跳转,但是这次需要输入内容,不准跳出键盘,所以用下面这个方法)
editText.setInputType(InputType.TYPE_NULL);来禁止手机软键盘。 (xml中设置inputType为none无效)

2.editText.setInputType(InputType.TYPE_CLASS_TEXT);来开启软键盘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&岁月不待人&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值