一、EditText 基础:不仅仅是输入框
EditText
是 TextView
的子类,允许用户输入和编辑文本。
1. 基本布局
XML
<EditText
android: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. 获取输入内容
java
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. 组合使用
XML
<!-- 邮箱输入 -->
<EditText
android:inputType="textEmailAddress"
android:hint="邮箱地址" />
<!-- 密码输入 -->
<EditText
android:inputType="textPassword"
android:hint="密码" />
<!-- 手机号码 -->
<EditText
android:inputType="phone"
android:hint="手机号" />
<!-- 多行评论 -->
<EditText
android:inputType="textMultiLine|textCapSentences"
android:lines="3"
android:gravity="top|start"
android:hint="请输入评论..." />
✅ 最佳实践 :始终为
EditText
设置合适的inputType
,提升输入效率和准确性。
三、软键盘(IME)控制
1. 控制软键盘行为
XML
<!-- 回车键功能 -->
<EditText
android:imeOptions="actionDone"
android:inputType="text"
android:nextFocusDown="@+id/et_password" />
<!-- 可选值: actionGo, actionSearch, actionSend, actionNext, actionDone -->
2. 监听回车键
java
etUsername.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// 处理"完成"按钮点击
hideKeyboard(v);
performLogin();
return true;
}
return false;
}
});
3. 显示/隐藏软键盘
java
// 显示软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(etUsername, InputMethodManager.SHOW_IMPLICIT);
// 隐藏软键盘
imm.hideSoftInputFromWindow(etUsername.getWindowToken(), 0);
四、输入过滤与格式化
1. 限制输入长度
XML
<EditText
android:maxLength="11"
android:hint="手机号(11位)" />
2. 自定义输入过滤器
java
// 只允许输入数字和字母
InputFilter filter = new InputFilter() {
@Override
public 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)
java
etPhone.addTextChangedListener(new TextWatcher() {
private String previous = "";
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
previous = s.toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
String digits = s.toString().replaceAll("\\D", ""); // 只保留数字
if (digits.length() > 11) {
digits = digits.substring(0, 11);
}
// 格式化为 3-4-4
String 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
。 - 避免在日志中打印密码。
- 考虑实现"显示/隐藏密码"功能:
XML
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="密码" />
</com.google.android.material.textfield.TextInputLayout>
2. 防止敏感信息保存
XML
<!-- 禁止输入历史和拼写检查 -->
<EditText
android:inputType="textNoSuggestions|textVisiblePassword"
android:importantForAutofill="no" />
六、Material Design 最佳实践
推荐使用 Material Design
的 TextInputLayout
+ TextInputEditText
组合,提供更专业的表单体验。
1. 添加依赖
Groovy
implementation 'com.google.android.material:material:1.11.0'
2. 使用 TextInputLayout
XML
<com.google.android.material.textfield.TextInputLayout
android: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.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
3. 动态显示错误信息
java
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 ) |
☐ |
✅ 处理焦点切换 | ☐ |
✅ 考虑安全性(密码、隐私) | ☐ |
✅ 优化用户体验(格式化、自动填充) | ☐ |
九、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!