Android EditText 获取/失去焦点

简介: 项目的需求中,又一个4位数的验证码界面,小弟才疏学浅,只想到了用线性布局里面放四个EditText。需求需要输入内容后,自动跳到下一个位置聚焦,删除指定位置后,自动跳到上一个位置聚焦,由于聚焦/非聚焦UI展示得都不同,所以每个editText都会频繁的设置焦点变化。之前因为是调用的系统键盘,所以,editText和键盘绑定后处理起来非常方便,但是,我们需要自定义一个展示在UI上的数字键盘,于是就有些bug。bug不难,但是有点杂乱,下面是我的一点解决办法,总结一下,以后也记得更清楚!

项目的需求中,又一个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);来开启软键盘。


相关文章
|
Android开发
Android EditText设置inputType之后minLines失效
Android EditText设置inputType之后minLines失效
287 0
|
6月前
|
XML 监控 Android开发
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
285 0
|
5月前
|
XML Java Android开发
14. 【Android教程】文本输入框 EditText
14. 【Android教程】文本输入框 EditText
623 2
|
Java Android开发 iOS开发
Android TextView 与 EditText 的区别与使用
Android TextView 与 EditText 的区别与使用
160 0
|
Java Android开发
Android 中设置EditText输入框提示文本hint的字体大小
Android 中设置EditText输入框提示文本hint的字体大小
327 0
|
XML Java Android开发
Android 中通过Java代码动态生成EditText视图,并循环遍历EditText取出遍历的ID和文本框的值
Android 中通过Java代码动态生成EditText视图,并循环遍历EditText取出遍历的ID和文本框的值
142 0
|
Android开发
Android EditText输入框不聚焦,点击跳转
Android EditText输入框不聚焦,点击跳转
|
XML Java 数据安全/隐私保护
Android 输入框(EditText)的输入限制,数字英文邮箱,可见\隐藏切换,踩过的坑!
最近做到了登录注册模块的各种输入判定,监听等等,因为需求上的需要,还是搞了好一会儿,今天在这总结一下。 常规的输入框输入需求有纯数字,字母,混合输入,邮箱,键盘默认打开数字键盘,密码可见性,键盘的收起弹出等等。
|
XML Android开发 数据安全/隐私保护
Android开发之输入框EditText介绍
Android开发之输入框EditText介绍
339 0
|
Android开发
Android EditText之软键盘搜索
Android EditText之软键盘搜索
677 0
Android EditText之软键盘搜索
下一篇
无影云桌面