EditText是Android中负责文本输入的基础控件,继承自TextView,几乎所有需要用户交互输入的场景都要用到它。初学者刚接触EditText时,常常会遇到输入内容拿不到、软键盘挡住输入框、输入类型不对导致键盘样式奇怪等问题。这篇文章从基础属性讲起,逐步覆盖监听、校验、软键盘处理等实用技巧,把常见坑一次性讲清楚。

一、EditText的基本用法与常用属性
EditText最简单的用法是在布局文件中直接声明。它继承自TextView,所以TextView的属性基本都能用,再加上一组输入相关的专有属性。下面是一个典型示例:
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
android:textColorHint="#999999"
android:maxLength="20"
android:inputType="text" />
其中android:hint是提示文字,输入框为空时显示,开始输入后自动消失;android:maxLength限制最大输入长度;android:inputType决定弹出的软键盘类型,这个属性非常关键,写错了会直接影响用户体验。
inputType的常用取值需要记牢:text是普通文本,textPassword会以密文显示输入内容,number只允许输入数字,phone弹出电话拨号键盘,textEmailAddress会在键盘中提供@符号方便输入邮箱。多个属性可以用|组合,例如text|textCapSentences表示普通文本且首字母大写。
如果不习惯写XML,也可以在代码中动态创建:
EditText editText = new EditText(this);
editText.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
editText.setHint("请输入内容");
editText.setInputType(InputType.TYPE_CLASS_TEXT);
动态创建的好处是灵活,适合表单项不确定的场景,比如后台下发配置动态生成输入界面。但一般日常开发还是推荐XML布局,结构清晰且便于维护。
二、获取输入内容与文本变化监听
拿到用户输入的内容是EditText最核心的操作。获取文本使用getText()方法,注意它返回的是Editable对象而不是String,需要调用toString()转换:
String content = etUsername.getText().toString().trim();
if (TextUtils.isEmpty(content)) {
Toast.makeText(this, "用户名不能为空", Toast.LENGTH_SHORT).show();
return;
}
这里有个细节要强调:用户很可能在输入框首尾输入空格,提交前调用trim()处理是良好习惯。判断空值推荐用TextUtils.isEmpty(),它能同时处理null和空字符串两种情况,比手动判断更稳妥。
实时监听输入变化需要用到TextWatcher接口,它包含三个回调方法:
etUsername.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 内容变化前回调
}
@Override
public void afterTextChanged(Editable s) {
// 内容变化后回调,常用于实时校验
String text = s.toString();
btnSubmit.setEnabled(text.length() >= 6);
}
});
三个方法中最常用的是afterTextChanged,可以做实时校验、搜索联想、按钮状态控制等。要注意的是,在afterTextChanged里再次调用setText()修改内容可能引发无限循环,如果确实需要修改,务必先用标志位判断,避免递归触发。
三、常见问题与踩坑解决方案
1. 软键盘遮挡输入框怎么办
软键盘遮挡是新手反馈最多的问题。最简单的解决方式是在Manifest中给对应Activity设置android:windowSoftInputMode="adjustResize",让布局在键盘弹出时自动压缩,保证输入框可见。如果界面是全屏沉浸式模式,adjustResize会失效,这时需要借助ViewTreeObserver监听布局变化,手动给根布局加 padding 或者用第三方库处理。
2. 如何限制只能输入特定字符
inputType只能粗略控制键盘类型,更精细的过滤要靠InputFilter。例如只允许输入数字和字母:
etInput.setFilters(new InputFilter[]{
new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (!Character.isLetterOrDigit(source.charAt(i))) {
return "";
}
}
return null; // 返回null表示接受输入
}
},
new InputFilter.LengthFilter(11) // 同时限制长度为11
});
如果设置了多个过滤器,长度限制也在同一处设置。很多同学习惯XML里写maxLength又在代码里setFilters,结果发现XML的限制失效了,原因就是setFilters会覆盖之前的过滤器配置,这是非常典型的坑。
3. 输入完成后收起软键盘
点击按钮提交时主动收起键盘能明显提升体验,代码如下:
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null && getCurrentFocus() != null) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
反过来,想在进入页面时自动弹出键盘,可以给EditText调用requestFocus()后再用InputMethodManager.showSoftInput(),但要注意在onResume之后调用,太早调用焦点还没建立会不生效。
4. 多行输入的配置
做评论、留言这类功能需要多行输入,正确配置是把inputType设为textMultiLine,同时设置android:minLines或android:lines控制行数。这里容易混淆的一点:如果不设置inputType而只加android:singleLine="true",这个属性已经被标记废弃,官方建议用android:maxLines="1"配合inputType="text"实现单行效果。
四、进阶技巧与最佳实践
掌握基础后,还有几个实用技巧值得了解。一是密码可见切换,material库的TextInputLayout自带密码可见开关,配合TextInputEditText使用,还能实现浮动标签和错误提示,比原生EditText美观得多,是官方推荐的表单方案:
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
app:passwordToggleEnabled="true"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
代码中通过textInputLayout.setError("密码不能为空")就能在输入框下方显示红色错误提示,省去了自己写校验提示UI的工作。二是提交前的正则校验,例如校验手机号:
public static boolean isPhoneValid(String phone) {
return !TextUtils.isEmpty(phone) && phone.matches("^1[3-9]\\d{9}$");
}
三是内存泄漏防范,在Activity或Fragment销毁时,记得移除TextWatcher监听,避免长生命周期的对象持有界面引用。虽然大部分场景影响不大,但养成好习惯对写出健壮的应用很有帮助。
总结一下,EditText上手简单,细节却不少:inputType决定键盘形态,TextWatcher负责实时监听,InputFilter做精细过滤,软键盘模式解决遮挡问题。把这些要点吃透,日常开发中绝大多数输入场景都能从容应对。
Android EditText输入框Android开发修改时间:2026-09-03 06:16:34