【Android】EditText使用和监听

发布于:2025-07-21 ⋅ 阅读:(17) ⋅ 点赞:(0)

在这里插入图片描述
三三想成为安卓糕手

一:用户登录校验

1:EditText文本输入框

    <EditText
        android:id="@+id/et_user_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:maxLines="16"
        android:hint="请输入用户名" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:maxLength="16"
        android:hint="请输入密码" />

2:hint提示信息

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

hint 提示线索

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:inputType输入类型

兄弟太吊了 android:inputType="number"

设置用户名的输入类型为number,那么调用出来的键盘如下左图所示(为数字键盘),输入框不接收输入非数字的内容

设置密码的输入类型为textPassword,那么该屏幕界面会被隐藏,并且做了一个加密的处理,还有不能被截图,默认输入法是数字带字母

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入框还可以接收很多种类型

文本,邮件地址,电话,日期时间等等

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4:maxLines位数限制

android:maxLength="16"这玩意好像对用户名位数限制不咋管用啊;对密码到是管用的很

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5:用户名和密码校验

实现效果

左图:用户名和密码正确但是没有勾选协议,点击登录

右图:用户名正确,密码错误,点击登录

这里的情况还有好几种,上述代码基本都能够拦截到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    //成员变量
	private EditText etUserName;
    private EditText etPassword;
initEditText();
//这个方法的调用应该在登录监听器触发之前,主要作用就是完成初始化,避免空指针异常
private void initEditText(){
        etUserName = findViewById(R.id.et_user_name);
        etPassword = findViewById(R.id.et_password);
    }
		/**
         * 监听登录按钮的状态
         *
         */
        Button loginButton = findViewById(R.id.btn_login);
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean checked = cbArgreement.isChecked();
                if(!checked){
                    Toast.makeText(CheckBoxActivity.this, "请勾选协议", Toast.LENGTH_SHORT).show();
                }
                String userName = etUserName.getText().toString().trim();
                String passWord = etPassword.getText().toString().trim();
                //点击登录按钮,检测用户名和密码都正确并且勾选了协议,此时才会进行页面跳转。
                if(userName.equals("admin") && passWord.equals(123456)){
                    //这句代码是在是太ex了兄弟,我完全是蒙蒙的状态啊xd,窝里哇瓦力哇一袋米扛几楼
                    //判断勾选了协议,点击登录按钮,进行页面跳转
                    startActivity(new Intent(CheckBoxActivity.this,SecondActivity.class));
                }else{
                    //准备弹窗提示
                    Toast.makeText(CheckBoxActivity.this, "用户名与密码不匹配", Toast.LENGTH_SHORT).show();
                }
            }
        });

.trim()方法属于String类中的,可以去除字符串两端的空白字符(包括空格,制表符,换行符等)

二:文本变化监听

0:监听器的生命周期

这里是一个非常大误区,这个监听器的销毁并不会随着方法的结束而结束。

一旦监听器注册完成,它就会一直保持活跃状态,直到满足以下条件之一:

  • EditText 控件被销毁:在 Activity 的onDestroy()方法执行之后。
  • 手动移除监听器:调用etUserName.removeTextChangedListener(...)方法。

1:代码

这里主要对用户名设置文本监听

	private void initEditText(){
        etUserName = findViewById(R.id.et_user_name);
        etPassword = findViewById(R.id.et_password);

        etUserName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.e(TAG,"CharSequence s" + s +  "," + " int start" + start +
                        "," + " int count" + count + "," + "int after" + after);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.e(TAG,"CharSequence s" + s +  "," + " int start" + start +
                        "," + " int count" + count + "," + "int after" + count);
            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.e(TAG,"afterTextChanged:" + s.toString());
            }
        });
    }

我们设置一个类TAG成员变量方便查看日志(快捷方式logt)

private static final String TAG = "CheckBoxActivity";//自己设置TAG名称

2:结果和日志分析

我们在用户名输入框中输入admin

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看日志

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

删掉下标为2的字符m

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看日志

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注:以下方法的分析只针对删除“admin”中字符‘m’的操作

3:beforeTextChanged

文本发生变化前被调用,有四个参数

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
	Log.e(TAG,"CharSequence s" + s +  "," + " int start" + start +
		"," + " int count" + count + "," + "int after" + after);
	}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CharSequence s

代表文本变化前(初始内容)

EditText 里原本的文字内容为“admin”,那s = admin

int start

表示文本中即将发生变化的起始位置索引

删除了“m”,索引位置为 2,start 就是 2 (这里替换操作同理)

int count

start 位置开始, “要被‘干掉’的旧字符数量”

m被干掉了,所以count = 1

提问:如果新字符和旧字符相同呢?

只要文本框的内容==经历了 “替换” 过程(无论替换前后内容是否一致),方法都会被触发,内部逻辑正常计算,==

int after

代表文本变化后,从 start 位置开始新增的字符数量

没有新增内容 after = 0

4:onTextChanged

文本变化时触发(如用户输入过程中)

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
	Log.e(TAG,"CharSequence s" + s +  "," + " int start" + start +
		"," + " int count" + count + "," + "int after" + count);
	}

前两个参数与beforeTextChanged参数相同

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CharSequence s

代表文本变化时(初始内容)

EditText 里原本的文字内容为“adin”,那s = adin

int start

表示文本中即将发生变化的起始位置索引

删除了“m”,索引位置为 2,start 就是 2 (这里替换操作同理)

int before

原文本被替换的长度,其实就是beforeTextChanged中的count(被干掉的数量)

这里是删除操作,也就是m被替换成了空,所以bfore = 1

int count

代表变化后,从 start 位置新增的字符数量

延续上面例子,若删掉 “m”,没有新增操作,那count = 0

5:afterTextChanged方法

文本变化后的最终完整内容

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@Override
public void afterTextChanged(Editable s) {
	Log.e(TAG,"afterTextChanged:" + s.toString());
}

6:总结

方法 触发时机 参数含义
beforeTextChanged 文本变化前触发(如用户输入前)。 - s:变化前的文本。
- start:变化开始的位置。
- count:即将被替换的原文本长度。
- after:新文本的长度。
onTextChanged 文本变化时触发(如用户输入过程中)。 - s:变化后的文本。
- start:变化开始的位置。
- before:原文本被替换的长度(即 beforeTextChanged 中的 count)。
- count:新插入的文本长度(即 beforeTextChanged 中的 after)。
afterTextChanged 文本变化后 -Editable s这里的 s 代表 文本变化后的最终完整内容 。类型可以转化为字符串类型

应用场景:哇嘎嘎嘎,实时获取输入的内容进行搜索


网站公告

今日签到

点亮在社区的每一天
去签到