目录
之前讲过文本视图TextView来展示文本,但是这些文本都是在预先设置的,如果需要自己输入文本就需要用到另一个控件--编辑框EditText。
编辑框EditText
编辑框EditText用于接受软键盘输入的文字,它是由文本视图派生而来的。除了原本文本视图所拥有的属性与方法外,编辑框还新增了一些属性,其中较为常用的属性如下文所示。
1.android:inputType:设置输入文本的类型,若同时使用多种类型可用竖线(|)把多种文本拼接起来。
2.android:hint:设置提示文本的内容。
3.android:textColorHint:设置同时文本的颜色。
4.android:maxLength:设置文本输入的最大长度。
下表是一些具体的属性介绍表。
| 属性 | 作用 | 常用值 |
|---|---|---|
android:inputType | 最重要的属性,指定输入类型,影响键盘布局和输入规则 | text, number, phone, textPassword等 |
android:hint | 设置提示文本,用户输入时消失 | 任意字符串 |
android:text | 设置初始文本内容 | 任意字符串 |
android:maxLines | 设置最大行数 | 数字,如1(单行), 3等 |
android:maxLength | 设置最大字符数 | 数字,如10, 140等 |
android:lines | 固定行数 | 数字 |
android:digits | 指定允许输入的字符 | 如"0123456789." |
| 属性 | 作用 | 常用值 |
|---|---|---|
android:imeOptions | 设置键盘动作按钮 | actionDone, actionSearch, actionNext |
android:focusable | 是否可获取焦点 | true, false |
android:selectAllOnFocus | 获取焦点时全选文本 | true, false |
android:cursorVisible | 光标是否可见 | true, false |
android:enabled | 是否启用编辑 | true, false |
下面是代码示例。第一个编辑框设置了maxLines的值为3,输入类型为多行文本,设置了提示文本的内容。第二个编辑框设置了lines的值为3,设置了提示文本及其文本颜色。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".EditTextActivity">
<EditText
android:id="@+id/editText_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="3"
android:inputType="textMultiLine"
android:hint="最多显示三行"
/>
<EditText
android:id="@+id/editText_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:hint="固定显示3行"
android:lines="3"
android:textColorHint="@color/teal_200"/>
</LinearLayout>
效果图如下,第一张图为输入前,第二张为输入后。第一个编辑框最多显示三行,小于三行时编辑框的高度会随行数变化但最高只有三行的高度,多出的部分可以上下滑动查看。第二个编辑框高度已经固定位三行的高度,不满三行的地方是空白的,超出三行也可以上下滑动查看。这是属性maxLines与lines的区别。


属性inputType的值有多种类型,下表为其值的分类表。
inputType属性值大全
1. 基础文本类型
| 属性值 | 说明 | 键盘效果 |
|---|---|---|
text | 普通文本 | 全键盘 |
textCapCharacters | 所有字母大写 | 全键盘,自动大写 |
textCapWords | 每个单词首字母大写 | 全键盘,单词首字母自动大写 |
textCapSentences | 每句首字母大写 | 全键盘,句子首字母自动大写 |
textAutoCorrect | 启用自动纠正 | 带自动纠正的全键盘 |
textAutoComplete | 启用自动完成 | 带自动完成的全键盘 |
textNoSuggestions | 禁用输入建议 | 无建议的全键盘 |
textMultiLine | 多行文本 | 带换行键的全键盘 |
textImeMultiLine | 支持输入法多行 | 输入法支持多行 |
2. 特殊文本格式
| 属性值 | 说明 | 键盘效果 |
|---|---|---|
textEmailAddress | 电子邮件地址 | 带 @ 和 . 的全键盘 |
textUri | 网址 URI | 带 / 和 .com 的全键盘 |
textWebEditText | 网页表单文本 | 网页优化的全键盘 |
textPersonName | 人名 | 人名优化的全键盘 |
textPostalAddress | 邮政地址 | 地址输入优化的键盘 |
textPassword | 密码(显示圆点) | 全键盘,输入显示为 • |
textVisiblePassword | 可见密码 | 全键盘,输入可见 |
textWebPassword | 网页密码 | 网页密码专用的全键盘 |
textPhonetic | 拼音输入 | 拼音输入法优化 |
textFilter | 文本过滤 | 搜索过滤优化的键盘 |
textShortMessage | 短消息 | 短信优化的键盘 |
textLongMessage | 长消息 | 长消息优化的键盘 |
textEmailSubject | 邮件主题 | 邮件主题优化的键盘 |
3. 数字类型
| 属性值 | 说明 | 键盘效果 |
|---|---|---|
number | 纯数字 | 数字键盘 |
numberSigned | 有符号数字 | 带负号的数字键盘 |
numberDecimal | 带小数数字 | 带小数点的数字键盘 |
numberPassword | 数字密码 | 数字键盘,输入显示为 • |
phone | 电话号码 | 电话拨号键盘 |
4. 日期时间类型
| 属性值 | 说明 | 键盘效果 |
|---|---|---|
date | 日期 | 日期输入优化的键盘 |
time | 时间 | 时间输入优化的键盘 |
datetime | 日期时间 | 日期时间输入优化的键盘 |
焦点变更监听器
编辑框是有点击事件的意味着有对应的监听器,但发现需要点击两次才会触发点击事件。这是因为第一次点击会触发焦点点击事件即编辑框会出现闪动的光标。对于编辑框来说,应当注册焦点变更监听器而不是点击监听器。总不能每次都要点击两次才触发点击事件吧。焦点变更监听器来自接口View.OnFocusChangeListener,注册方法是setOnFocusChangeListener。下面是代码示例。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".EditTextActivity">
<EditText
android:id="@+id/editText_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:maxLength="11"
android:hint="请输入11为号码"
/>
<EditText
android:id="@+id/editText_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:hint="请输入验证码" />
</LinearLayout>
//部分Java代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_text);
EditText editText_1,editText_2;
editText_1 = findViewById(R.id.editText_1);
editText_2 = findViewById(R.id.editText_2);
editText_2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
String str = editText_1.getText().toString();
if(str.length() < 11 || TextUtils.isEmpty(str)){
editText_1.requestFocus();
}
}
});
}
效果图如下,当第一个编辑框文本长度不足11 时点击第二个编辑框会触发焦点变更将焦点移至第一个编辑框。

文本变化监听器
文本变化监听器用于监听编辑框中输入的文本变化,包括添加与删除文本时会触发监听器。使用文本变化监听器需要实现接口TextWatcher,带接口有三个监控方法:beforeTextChanged在文本改变前触发;onTextChanged在文本改变过程中触发;afterTextChanged在文本改变后触发,比较常用的监控方法是最后一个。注册监听器需要调用编辑框的方法addTextChangedListener。下面为代码示例。xml代码与上面类似。Java代码中的监听器主要是监听第一个编辑框的文本变化然后将文本内容同步到第二个编辑框上。
//部分Java代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_text);
EditText editText_1,editText_2;
editText_1 = findViewById(R.id.editText_1);
editText_2 = findViewById(R.id.editText_2);
editText_1.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void afterTextChanged(Editable editable) { editText_2.setText(editable.toString()); }
});
}
效果图如下。两个编辑框的文本一致。除了这种用法,也可以当第一个编辑框文本长度达到11时变更焦点到第二个编辑框或者关闭输入法等。

1647

被折叠的 条评论
为什么被折叠?



