【Android】EditText使用和监听
三三想成为安卓糕手
一:用户登录校验
1:EditText文本输入框
<EditTextandroid:id="@+id/et_user_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="number"android:maxLines="16"android:hint="请输入用户名" /><EditTextandroid: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() {@Overridepublic 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() {@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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 代表 文本变化后的最终完整内容 。类型可以转化为字符串类型 |
应用场景:哇嘎嘎嘎,实时获取输入的内容进行搜索