![Android Studio开发实战:从零基础到App上线(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/515/26793515/b_26793515.jpg)
3.4 编辑框
本节介绍Android的两种编辑框,分别是文本编辑框EditText与自动完成编辑框AutoCompleteTextView。在介绍EditText控件时,除了基本属性和方法,还另外阐述了常见的4种编辑处理:更换光标、更换边框、自动隐藏输入法和输入回车符自动换行。
3.4.1 文本编辑框EditText
EditText是文本编辑框,用户可在此输入文本等信息。EditText的常用属性说明如下。
- inputType:指定输入的文本类型,代码中对应的方法是setInputType。输入类型的取值说明见表3-3,若同时使用多种文本类型,则可使用竖线“|”把多种文本类型拼接起来。
- maxLength:指定文本允许输入的最大长度。该属性无法通过代码设置。
- hint:指定提示文本的内容,代码中对应的方法是setHint。
- textColorHint:指定提示文本的颜色,代码中对应的方法是setHintTextColor。
表3-3 输入类型的取值说明
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-T90_106664.jpg?sign=1738933930-vEErqFkub0OORPAH9xPAGdLABatiChZZ-0-60f190a005145356c80b235b97e86668)
编辑框除了上述文本与提示文本的基本操作外,实际开发中还常常关注4个方面:更换编辑框的光标、更换编辑框的边框、自动隐藏输入法、输入回车符自动跳转。
1. 更换编辑框的光标
EditText与光标处理有关的属性主要有两个,分别是:
- cursorVisible,指定光标是否可见。代码中对应的方法是setCursorVisible。
- textCursorDrawable,指定光标的图像。该属性无法通过代码设置。
如果要隐藏光标,就要把cursorVisible设置为false。如果要变更光标的样式,就要修改textCursorDrawable设置新图像。如图3-13所示,光标被换成自定义的红色竖线光标。
2. 更换编辑框的边框
EditText的边框通过background属性控制,如果要隐藏边框,就要把background设置为@null;如果要修改边框的样式,就要将background设置为其他边框图形。
下面是一个边框定义XML的例子,一旦编辑框获得焦点(例如用户点击了该编辑框),边框就会显示图形shape_edit_focus;否则默认显示shape_edit_normal。
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P91_106658.jpg?sign=1738933930-m6nXpfUF7kGRZj0Dl1E5OfCv7EbdtKBH-0-be1f1167036fc26bf417ec107a03f462)
上述自定义边框的效果如图3-14所示,未点击时显示灰色的圆角边框,点击后显示蓝色的圆角边框。
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P91_8352.jpg?sign=1738933930-FyuNYJ7Z0NTdzzy0p3dribWXrsJCmGge-0-e15b955665d50e52c6bfcaeb6d3fca22)
图3-13 给EditText更换图标样式
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P91_8353.jpg?sign=1738933930-7VhBKgt0u7UGbT3w5u9peEVt92ibPTi6-0-44f31cc7a35ba053251c5c9a8c162637)
图3-14 给EditText更换边框样式
3. 自动隐藏输入法
如果页面上有EditText控件,开发者又没做其他处理,那么用户打开该页面时往往会自动弹出输入法。这是因为编辑框会默认获得焦点,即默认模拟用户的点击操作,于是输入法的软键盘就弹出了。要想避免这种情况,就得阻止编辑框默认获得焦点。比较常见的做法是给该页面的根节点设置focusable和focusableInTouchMode属性,通过将这两个属性设置为true可强制让根节点获得焦点,从而避免输入法自动弹出的尴尬。
由于软键盘通常会遮盖“登录”“确认”“下一步”等按钮,造成用户输入完毕得再点一次返回键才能关闭软键盘。大家都希望省事点,比如手机号输入满11位软键盘自动关闭,这样就会极大改善用户体验。一个好用的App就是在这一点一滴中体现出来的。
想让编辑框文本达到指定长度时自动关闭输入法,开发者需要获得两个参数,第一个是该编辑框允许输入的最大长度,第二个是当前已经输入的文本长度。当已输入的文本长度等于最大长度时,即可触发关闭软键盘。自动隐藏输入法可分解为3个功能点,分别是获取编辑框的最大长度、监控当前已输入的文本长度和关闭软键盘。
(1)获取编辑框的最大长度
前面提到maxLength属性可设置最大长度,但是EditText并没有直接提供获取最大长度的方法,不过开发者可以通过反射方式间接获得最大长度,具体代码参见本书附带源码middle模块里面ViewUtil.java的getMaxLength方法。
(2)监控当前已输入的文本长度
这个监控操作用到一个文本监听器接口TextWatcher,该接口提供了3个监控方法,具体说明如下。
- beforeTextChanged:在文本改变之前触发。
- onTextChanged:在文本改变过程中触发。
- afterTextChanged:在文本改变之后触发。
这里用到的是afterTextChanged方法,开发者需要自己写个监听器实现TextWatcher接口,另外再给EditText对象调用addTextChangedListener方法注册该监听器。下面是一个具体实现该监听器的例子,用途是在输入文本达到指定长度时自动隐藏输入法:
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P92_106656.jpg?sign=1738933930-pFidUSEXlTxm3Ge1L2IzqTMyK0trb6KI-0-7357a1e455578295cc01779262751cfd)
(3)关闭软键盘
输入法通过系统服务INPUT_METHOD_SERVICE管理,所以隐藏输入法也要通过该服务实现。下面是关闭软键盘的两种方式及其代码:
① 调用toggleSoftInput方法:
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P93_106650.jpg?sign=1738933930-GDUbGLGfZJW7dunygj7wtG9cSxPqJl39-0-047c89c42e0737b68d84836c78d2d57d)
② 调用hideSoftInputFromWindow方法:
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P93_106651.jpg?sign=1738933930-wu80e7vnzdLzWjioTUYQwfqtSa9bSv7L-0-4541a6b71df331f2fed9ede57367ac2c)
完成隐藏输入法的编码后,可在页面上观察效果,如图3-15所示。此时手机号码输入了10位,还没达到11位的最大长度,故而输入法依然显示。手机号再输入一位数字,总长度11位达到最大长度的限制,于是输入法自动隐藏,如图3-16所示。
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P93_8668.jpg?sign=1738933930-Mo8WOGC8DfA5HRt4YnAN1MNwglMfvw8O-0-f596d033e944fb13865093df70936872)
图3-15 输入10位手机号码
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P93_8669.jpg?sign=1738933930-vLudFheCkcXnQS2IJuW2iCfOCwzDby42-0-2b19b88d4b4ce11a48faa9143cce0065)
图3-16 输入11位手机号码
4. 输入回车符自动跳转
在录入用户信息时(比如输入姓名、密码等),往EditText控件输入回车键,常常不是换行而是让光标直接跳到下一个编辑框。该功能也用到了文本监听器接口TextWatcher,主要监听用户是否输入回车符,如果监控到已输入回车符,就自动将焦点移到下一个控件,从而实现回车符自动跳转的要求。
下面是一个回车符监听器的代码例子,注意注释部分的文字说明:
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P94_106649.jpg?sign=1738933930-L32BJvldS4pLalYea89CIBuxuefiof2k-0-5b96b900645629c7c8d402ff58cfd35a)
下面演示一下输入回车符自动跳转的效果图,文本输入完毕后还没输入回车符,此时焦点仍然停留在编辑框,如图3-17所示。输入回车符,此时焦点离开编辑框,并自动移动到“登录”按钮(编辑框的光标消失,按钮背景变深),如图3-18所示。
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P95_8944.jpg?sign=1738933930-lYK51sSbhTepv872WZv8hOM0p2ZGWFjy-0-aad6202072d3570537e59c5e88f1b539)
图3-17 未按回车符
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P95_8945.jpg?sign=1738933930-xfQXLIWA5KtwA9hvmCRk0xgXvj6jEJJ3-0-abf685bb2ee4adccca7a635c7bb0c55e)
图3-18 已按回车符
3.4.2 自动完成编辑框AutoCompleteTextView
自动完成编辑框一般用于搜索文本框,如在电商App的搜索框输入商品文字时,下方会自动弹出提示词列表,方便用户快速选择具体商品。AutoCompleteTextView的实现原理是:EditText结合监听器TextWatcher与下拉列表Spinner,一旦监控到EditText的文本发生变化,就自动弹出适配好的文字下拉列表,选中具体的下拉项向EditText填入相应文字。
AutoCompleteTextView新增的几个属性都与下拉列表有关,详细说明见表3-4。
表3-4 自动完成编辑框的属性和设置方法说明
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-T95_106644.jpg?sign=1738933930-cyXzq4a5wUvNimz1JlCrLpu6Js9TFziF-0-be6071f96d8b283ee1d02d556a4e30a1)
下面是使用AutoCompleteTextView的代码例子:
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P96_106642.jpg?sign=1738933930-Xi3uf7AXJ64Z2Iwi9rh6E8jjHdQa6lh3-0-6259dd2125fe9a9e134921da95a551a7)
自动完成编辑框的具体效果如图3-19所示,下拉列表的内容会自动与输入文本进行匹配。
![](https://epubservercos.yuewen.com/2EEE11/15253384705226606/epubprivate/OEBPS/Images/Figure-P96_106643.jpg?sign=1738933930-oTYYEAOeU9UCRjbYBjFVrg78y6GtjJin-0-bbe0b93ec7af8315227b43ed378a1f59)
图3-19 自动完成编辑框的自动匹配下拉列表