Android EditText 的基本使用方法和常用功能

好的,这里为您总结一下 Android EditText 的常用属性和方法。EditTextTextView 的子类,因此它继承了 TextView 的所有特性,并增加了文本编辑的功能。


一、常用 XML 属性

这些属性主要在布局文件中设置。

1. 输入类型

这是最重要的属性之一,它决定了键盘类型和输入行为。

android:inputType="..."

常用值:

  • text: 普通文本。
  • textCapWords/textCapSentences: 单词/句子首字母大写。
  • textPassword/numberPassword: 密码类型,显示为圆点。
  • number/numberSigned: 数字(有符号数字)。
  • phone: 电话号码键盘。
  • emailAddress: 电子邮件地址键盘(带 @ 符号)。
  • textMultiLine: 支持多行输入。
  • textEmailSubject: 邮件主题。
  • textUri: 网址输入。
  • date/time: 日期/时间(行为可能因设备而异)。
  • 可以组合使用textCapSentences|textMultiLine

2. 提示文本

android:hint="请输入用户名"

EditText 为空时显示的灰色提示文字。

3. 文本

android:text="预设文本"

设置 EditText 的初始文本。

4. 行数与滚动

android:lines="5" // 固定高度为5行
android:maxLines="10" // 最大高度为10行,超过则滚动
android:minLines="2" // 最小高度为2行
android:scrollbars="vertical" // 当文本超出时显示垂直滚动条

5. 输入限制

android:maxLength="10" // 最大输入长度为10个字符

6. 其他实用属性

// 光标和文本选择
android:cursorVisible="true|false" // 控制光标是否可见
android:textIsSelectable="true" // 文本是否可选(但不能编辑,适用于TextView)

// 外观
android:background="@null" // 移除默认下划线背景(常用于Material Design)
android:drawableStart="@drawable/ic_user" // 在起始位置设置图标
android:drawablePadding="8dp" // 图标与文本的间距

// 单行与省略号
android:singleLine="true" // 已废弃,推荐使用 maxLines 和 minLines
android:ellipsize="end" // 文本过长时在末尾显示省略号...

// 字体
android:textSize="16sp"
android:textColor="@color/black"
android:textColorHint="@color/grey" // 提示文字的颜色

二、常用方法

这些方法主要在 Java/Kotlin 代码中使用。

1. 获取和设置文本

// Kotlin
val inputText = editText.text.toString() // 获取文本(推荐)
editText.setText("新文本") // 设置文本
editText.text = Editable.Factory.getInstance().newEditable("新文本") // 另一种设置方式

// Java
String inputText = editText.getText().toString();
editText.setText("新文本");

注意:直接使用 getText() 返回的是 Editable 对象,通常需要转换为 String

2. 文本变化监听

这是一个非常核心的功能。

editText.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        // 文本即将改变时调用
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        // 文本正在改变时调用,最常用
        // s 是当前输入框中的内容
        if (s.toString().length > 5) {
            // 执行某些操作,如实时搜索、验证格式等
        }
    }

    override fun afterTextChanged(s: Editable?) {
        // 文本改变完成后调用
        // 可以在这里对 s 进行修改,例如自动添加格式符号
    }
})

3. 焦点控制

editText.requestFocus() // 请求焦点,弹出键盘
editText.clearFocus() // 清除焦点,隐藏键盘

// 设置焦点变化监听
editText.setOnFocusChangeListener { view, hasFocus ->
    if (hasFocus) {
        // 获得焦点
    } else {
        // 失去焦点
    }
}

4. 输入法操作

// 显示软键盘
fun showKeyboard(context: Context, view: View) {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

// 隐藏软键盘
fun hideKeyboard(context: Context, view: View) {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(view.windowToken, 0)
}

// 调用示例
showKeyboard(this, editText)
hideKeyboard(this, editText)

5. 选择文本与光标控制

editText.selectAll() // 选中所有文本
editText.setSelection(editText.text.length) // 将光标移动到文本末尾
editText.setSelection(start, end) // 选择从 start 到 end 的文本

6. 错误提示

在 Material Components 中,你可以使用 TextInputLayout 来包裹 EditText 以实现更好的错误提示效果。

// 假设 textInputLayout 是包裹着 editText 的 TextInputLayout
textInputLayout.error = "密码不能为空"
textInputLayout.isErrorEnabled = false // 清除错误提示

三、实用技巧与最佳实践

  1. 使用 TextInputLayout:来自 Material Design 库,它提供了浮动标签、错误提示、字符计数等强大功能,是现代 Android 开发的首选。

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:errorEnabled="true">
    
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用户名" />
    
    </com.google.android.material.textfield.TextInputLayout>
    
  2. 输入过滤:使用 InputFilter 来限制输入内容,例如只允许输入字母和数字。

    val filters = arrayOf<InputFilter>(InputFilter { source, start, end, dest, dstart, dend ->
        // 只允许字母和数字
        if (source.toString().matches(Regex("[a-zA-Z0-9]*"))) {
            source
        } else {
            ""
        }
    })
    editText.filters = filters
    
  3. 处理回车键动作

    editText.setOnEditorActionListener { v, actionId, event ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // 当用户按下键盘上的“完成”按钮时
            hideKeyboard(this, editText)
            true // 表示已处理
        } else {
            false
        }
    }
    
  4. 性能考虑:在 TextWatcheronTextChanged 中不要执行耗时操作,如果需要(如网络请求),请添加防抖处理。

这份总结涵盖了 EditText 在日常开发中的绝大多数使用场景。熟练掌握这些属性和方法,将能高效地处理各种用户输入需求。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容