Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制(推荐)
作者:邹奇 发布时间:2023-01-19 23:52:35
做这个功能是因为开发项目的时候,由于后台接口的一些参数的值的长度有要求,不能超过多少个字符,所以在编辑框中输入的字符是要有限制的。
下面就来看一下demo的实现过程:
首先,在xml控件中放置一个EditText控件,然后初始化该控件并对该控件添加文本监听。xml自己简单的设计一下,代码较为简单,直接上代码:
package com.example.edittext;
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
public class MainActivity extends Activity {
private static final int LIMIT = 10;// 最大字数限制
private EditText et_word_limit;// EditText控件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取EditText控件
et_word_limit = (EditText) findViewById(R.id.editText1);
setListeners();// 编辑框添加文本监听
}
private void setListeners() {
// editText控件添加文本变化监听
et_word_limit.addTextChangedListener(new MyTextWatcher(et_word_limit, LIMIT, MainActivity.this));
}
}
上面的代码中给EditText控件添加文本监听的时候,我用的是自定义的TextWatcher,需要传过去的参数有三个,方法为:
// editText控件添加文本变化监听
et_word_limit.addTextChangedListener(new MyTextWatcher(et_word_limit, LIMIT, MainActivity.this));
一个是EditText控件,即要添加监听的那个编辑框控件;
一个是字符的限制数目,即最多能在编辑框中输入的内容;
一个是当前类的上下文对象。
当然,你要是还想再添加一个TextView控件实时显示输入的字符个数的话,那就再传一个参数过去就行。反正具体需求,具体实现就行了,变化也不大,自己学会变通。
最关键的类,自定义的TextWatcher类如下,代码如下:
package com.example.edittext;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;
/**
* 自定义MyTextWatcher类实现TextWatcher接口,并重写相关方法
*
* @author 邹奇
*
*/
public class MyTextWatcher implements TextWatcher {
private int limit;// 字符个数限制
private EditText text;// 编辑框控件
private Context context;// 上下文对象
int cursor = 0;// 用来记录输入字符的时候光标的位置
int before_length;// 用来标注输入某一内容之前的编辑框中的内容的长度
public MyTextWatcher(EditText text, int limit,
Context context) {
this.limit = limit;
this.text = text;
this.context = context;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
before_length = s.length();
}
/**
* s 编辑框中全部的内容 、start 编辑框中光标所在的位置(从0开始计算)、count 从手机的输入法中输入的字符个数
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
cursor = start;
// Log.e("此时光标的位置为", cursor + "");
}
@Override
public void afterTextChanged(Editable s) {
// 这里可以知道你已经输入的字数,大家可以自己根据需求来自定义文本控件实时的显示已经输入的字符个数
Log.e("此时你已经输入了", "" + s.length());
int after_length = s.length();// 输入内容后编辑框所有内容的总长度
// 如果字符添加后超过了限制的长度,那么就移除后面添加的那一部分,这个很关键
if (after_length > limit) {
// 比限制的最大数超出了多少字
int d_value = after_length - limit;
// 这时候从手机输入的字的个数
int d_num = after_length - before_length;
int st = cursor + (d_num - d_value);// 需要删除的超出部分的开始位置
int en = cursor + d_num;// 需要删除的超出部分的末尾位置
// 调用delete()方法将编辑框中超出部分的内容去掉
Editable s_new = s.delete(st, en);
// 给编辑框重新设置文本
text.setText(s_new.toString());
// 设置光标最后显示的位置为超出部分的开始位置,优化体验
text.setSelection(st);
// 弹出信息提示已超出字数限制
Toast.makeText(context, "已超出最大字数限制", Toast.LENGTH_SHORT).show();
}
}
}
上面的代码已经给出了注释,说的也很明白,下面说说我的思路吧!
首先,这个自定义的类需要实现TextWatcher接口,并重写相关的方法。
这时候,需要先知道编辑框没有输入内容之前里面的字符个数,需要知道输入内容时候的光标所在的位置,需要知道输入内容完毕后编辑框里的字符的个数。这些知道后就简单了,最大限制数你是知道的;这时候只需要根据以上的一些数据来删除超出部分字符就可以了。这个具体的实现方法写在了
public void afterTextChanged(Editable s){}
重写的方法里面,关键的注释都有,大家可以好好的研究一下,说不定会有更加简单的方法。
以上所述是小编给大家介绍的Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制(推荐)网站的支持!
来源:http://blog.csdn.net/csdnzouqi/article/details/53284284


猜你喜欢
- 设置OpenFeign的FeignClient的Header信息在微服务间使用Feign进行远程调用时需要在 header 中添加信息,那么
- ArrrayList是Java中经常被用到的集合,弄清楚它的底层实现,有利于我们更好地使用它。下图是ArrayList的UML图从图中我们可
- 本文实例讲述了Java编程中文件读写的方法。分享给大家供大家参考,具体如下:Java中文件读写操作的作用是什么?回答这个问题时应该先想到的是
- 本文实例讲述了WinForm实现窗体最大化并遮盖任务栏的方法。分享给大家供大家参考。具体实现方法如下:using System;using
- startJVM是加载jvm用的方法。在JPype,apache mod等等很多地方都用到。但凡要用其他语言来加载jvm进程,就要用到这个。
- 一、简单介绍Unity 游戏实例开发集合,使用简单易懂的方式,讲解常见游戏的开发实现过程,方便后期类似游戏开发的借鉴和复用。本节介绍,Fly
- 基于IDEA生成可执行jar包1.编写class的代码,注意一定要有main()方法才可以生成jar包,main()方法可以没有内容。例如:
- 本文实例为大家分享了Java实现人机猜拳游戏的具体代码,供大家参考,具体内容如下实现:User类public class User { pr
- 目录构造方法方法介绍reduce归约构造方法// 1.无参数构造方法new ConcurrentHashMap();// 2.指定初始容量n
- 关于数据绑定Xamarin 单向、双向绑定Xaml绑定C#代码绑定在此之前,几段 伪代码 帮助像我一样菜的同学入门。。。假如说,有两个控件,
- public void PrintPercentage(int FinishedCount, int TotalCount) {
- 本文实例讲述了Java中public static void main(String args[])的来龙去脉。分享给大家供大家参考,具体如
- 先看一下Android悬浮按钮点击回到顶部的效果:FloatingActionButton是Design Support库中提供的一个控件,
- 前言前面说到在我们应对高并发的场景,请求量过于大的情况下给我们服务器的压力很多,造成缓存穿透、击穿、雪崩,那么我们采用布隆过滤器,有兴趣的小
- 本文实例讲述了C#控制台进行文件读写的方法。分享给大家供大家参考。具体如下:C#控制台进行文件写入:using System;using S
- springboot 针对jackson是自动化配置的,如果需要修改,有两种方式:方式一:通过application.yml配置属性说明:#
- 这篇文章向大家分享了几段代码,主要是关于Thread+IO文件的加密解密,下面看看具体代码:加密启动线程package com.hz.sub
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 1.1 JDK 14详细概述JDK 8 已经在 2014年 3月 18日正式可用,JDK 8作为长期支持(Long-Term-Support
- 获取map的值主要有四种方法,这四种方法又分为两类,一类是调用map.keySet()方法来获取key和value的值,另一类则是通过map