Android开发-文本输入
一、EditText 基础:不仅仅是输入框
EditText
是 TextView
的子类,允许用户输入和编辑文本。
1. 基本布局
<EditTextandroid:id="@+id/et_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入用户名"android:textColorHint="#999999"android:textColor="#333333"android:textSize="16sp"android:padding="12dp"android:background="@drawable/edittext_bg" />
2. 获取输入内容
EditText etUsername = findViewById(R.id.et_username);
String username = etUsername.getText().toString().trim();
⚠️ 注意:始终使用
trim()
去除首尾空格。
二、inputType:精准控制输入类型
android:inputType
是控制 EditText
输入内容和软键盘类型的关键属性。
1. 常用 inputType 值
inputType | 说明 | 软键盘 |
---|---|---|
text | 普通文本 | QWERTY |
textEmailAddress | 邮箱地址 | 带 @ 和 . 的键盘 |
textPassword | 密码(隐藏) | QWERTY,通常带“显示密码”图标 |
textVisiblePassword | 可见密码 | QWERTY |
number | 数字 | 数字键盘 |
numberPassword | 数字密码 | 数字键盘,隐藏 |
phone | 电话号码 | 带数字和 *、# 的键盘 |
datetime | 日期时间 | 日期时间键盘 |
textMultiLine | 多行文本 | 回车键换行 |
textCapSentences | 首字母大写 | - |
textCapWords | 单词首字母大写 | - |
textCapCharacters | 全部大写 | - |
textNoSuggestions | 禁用拼写建议 | - |
2. 组合使用
<!-- 邮箱输入 -->
<EditTextandroid:inputType="textEmailAddress"android:hint="邮箱地址" /><!-- 密码输入 -->
<EditTextandroid:inputType="textPassword"android:hint="密码" /><!-- 手机号码 -->
<EditTextandroid:inputType="phone"android:hint="手机号" /><!-- 多行评论 -->
<EditTextandroid:inputType="textMultiLine|textCapSentences"android:lines="3"android:gravity="top|start"android:hint="请输入评论..." />
✅ 最佳实践:始终为
EditText
设置合适的inputType
,提升输入效率和准确性。
三、软键盘(IME)控制
1. 控制软键盘行为
<!-- 回车键功能 -->
<EditTextandroid:imeOptions="actionDone"android:inputType="text"android:nextFocusDown="@+id/et_password" /><!-- 可选值: actionGo, actionSearch, actionSend, actionNext, actionDone -->
2. 监听回车键
etUsername.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {if (actionId == EditorInfo.IME_ACTION_DONE) {// 处理“完成”按钮点击hideKeyboard(v);performLogin();return true;}return false;}
});
3. 显示/隐藏软键盘
// 显示软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(etUsername, InputMethodManager.SHOW_IMPLICIT);// 隐藏软键盘
imm.hideSoftInputFromWindow(etUsername.getWindowToken(), 0);
四、输入过滤与格式化
1. 限制输入长度
<EditTextandroid:maxLength="11"android:hint="手机号(11位)" />
2. 自定义输入过滤器
// 只允许输入数字和字母
InputFilter filter = new InputFilter() {@Overridepublic CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {String blockChars = "!@#$%^&*()_+-=[]{}|;':\",./<>?";for (int i = start; i < end; i++) {if (blockChars.indexOf(source.charAt(i)) != -1) {return ""; // 过滤掉}}return null; // 允许输入}
};
etUsername.setFilters(new InputFilter[]{filter});
3. 实时格式化(如手机号 3-4-4)
etPhone.addTextChangedListener(new TextWatcher() {private String previous = "";@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {previous = s.toString();}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {String digits = s.toString().replaceAll("\\D", ""); // 只保留数字if (digits.length() > 11) {digits = digits.substring(0, 11);}// 格式化为 3-4-4String formatted = formatPhoneNumber(digits);if (!formatted.equals(s.toString())) {s.replace(0, s.length(), formatted);}}private String formatPhoneNumber(String digits) {if (digits.length() <= 3) return digits;else if (digits.length() <= 7) return digits.substring(0, 3) + "-" + digits.substring(3);else return digits.substring(0, 3) + "-" + digits.substring(3, 7) + "-" + digits.substring(7);}
});
五、安全性与隐私
1. 密码输入安全
- 使用
textPassword
或textWebPassword
。 - 避免在日志中打印密码。
- 考虑实现“显示/隐藏密码”功能:
<com.google.android.material.textfield.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:passwordToggleEnabled="true"><com.google.android.material.textfield.TextInputEditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPassword"android:hint="密码" /></com.google.android.material.textfield.TextInputLayout>
2. 防止敏感信息保存
<!-- 禁止输入历史和拼写检查 -->
<EditTextandroid:inputType="textNoSuggestions|textVisiblePassword"android:importantForAutofill="no" />
六、Material Design 最佳实践
推荐使用 Material Design
的 TextInputLayout
+ TextInputEditText
组合,提供更专业的表单体验。
1. 添加依赖
implementation 'com.google.android.material:material:1.11.0'
2. 使用 TextInputLayout
<com.google.android.material.textfield.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="用户名"app:errorEnabled="true"app:counterEnabled="true"app:counterMaxLength="20"><com.google.android.material.textfield.TextInputEditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="text"android:maxLines="1" /></com.google.android.material.textfield.TextInputLayout>
3. 动态显示错误信息
TextInputLayout tilUsername = findViewById(R.id.til_username);
TextInputEditText etUsername = tilUsername.getEditText();// 验证输入
if (username.isEmpty()) {tilUsername.setError("用户名不能为空");
} else {tilUsername.setError(null); // 清除错误
}
✅ 优势:
- 浮动标签(Floating Label)
- 内置错误提示
- 字数统计
- 更好的无障碍支持
七、用户体验优化
- 自动聚焦:页面打开时自动聚焦到第一个输入框。
- 回车跳转:使用
nextFocusDown
实现输入框间的跳转。 - 清除按钮:长按或聚焦时显示清除图标。
- 输入提示:使用
AutoCompleteTextView
提供搜索建议。 - 防抖提交:避免用户快速点击提交按钮。
八、总结:文本输入设计 checklist
项目 | 是否完成 |
---|---|
✅ 设置合适的 inputType | ☐ |
✅ 提供清晰的 hint | ☐ |
✅ 限制输入长度 (maxLength ) | ☐ |
✅ 使用 TextInputLayout (推荐) | ☐ |
✅ 实现输入验证与错误提示 | ☐ |
✅ 控制软键盘行为 (imeOptions ) | ☐ |
✅ 处理焦点切换 | ☐ |
✅ 考虑安全性(密码、隐私) | ☐ |
✅ 优化用户体验(格式化、自动填充) | ☐ |
九、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!