文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android EditText 获取/失去焦点

2023-09-05 20:25

关注

项目的需求中,又一个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:

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

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

来源地址:https://blog.csdn.net/LoveFHM/article/details/130555190

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯