Android开发-文本输入

一、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)
  • 内置错误提示
  • 字数统计
  • 更好的无障碍支持

七、用户体验优化

  1. 自动聚焦:页面打开时自动聚焦到第一个输入框。
  2. 回车跳转 :使用 nextFocusDown 实现输入框间的跳转。
  3. 清除按钮:长按或聚焦时显示清除图标。
  4. 输入提示 :使用 AutoCompleteTextView 提供搜索建议。
  5. 防抖提交:避免用户快速点击提交按钮。

八、总结:文本输入设计 checklist

项目 是否完成
✅ 设置合适的 inputType ☐
✅ 提供清晰的 hint ☐
✅ 限制输入长度 (maxLength) ☐
✅ 使用 TextInputLayout (推荐) ☐
✅ 实现输入验证与错误提示 ☐
✅ 控制软键盘行为 (imeOptions) ☐
✅ 处理焦点切换 ☐
✅ 考虑安全性(密码、隐私) ☐
✅ 优化用户体验(格式化、自动填充) ☐

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
7177774 天前
研发平台选哪家比较好:2026年主流平台对比与Gitee选型指南
人工智能·gitee
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone4 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen4 天前
属性动画原理与高级动画实现
android·kotlin·canvas