Android开发-文本输入

一、EditText 基础:不仅仅是输入框

EditTextTextView 的子类,允许用户输入和编辑文本。

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. 密码输入安全

  • 使用 textPasswordtextWebPassword
  • 避免在日志中打印密码。
  • 考虑实现"显示/隐藏密码"功能:
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 DesignTextInputLayout + 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)
✅ 处理焦点切换
✅ 考虑安全性(密码、隐私)
✅ 优化用户体验(格式化、自动填充)

九、结语

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

相关推荐
No Silver Bullet3 小时前
Android Studio如何开启离线编译模式
android
vocal5 小时前
【Android 构建优化】R8 : 混淆,压缩与优化
android
叽哥5 小时前
Kotlin学习第 7 课:Kotlin 空安全:解决空指针问题的核心机制
android·java·kotlin
诺诺Okami5 小时前
Android Framework-Launcher-默认布局的加载
android
狂浪天涯5 小时前
Android Security | SEAndroid 的主体
android
马 孔 多 在下雨8 小时前
安卓旋转屏幕后如何防止数据丢失-ViewModel入门
android
Just_Paranoid14 小时前
【Settings】恢复出厂设置密码校验
android·python·settings·sha256·hmac-sha256
肥肥呀呀呀16 小时前
flutter配置Android gradle kts 8.0 的打包名称
android·flutter
平生不喜凡桃李19 小时前
C++ 异常
android·java·c++