Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制

做这个功能是因为开发项目的时候,由于后台接口的一些参数的值的长度有要求,不能超过多少个字符,所以在编辑框中输入的字符是要有限制的。



下面就来看一下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){}

    重写的方法里面,关键的注释都有,大家可以好好的研究一下,说不定会有更加简单的方法。



其实我还有没有考虑到的东西,就是一个字符a或者一个数字1都算一个字数限制,但是其实这样是不对的,所以这篇博客大家可以参考和优化。要是你想拿来用的话最好是输入的内容的类型是单一的才可行,比如都是数字,比如都是汉字,比如都是字符。以后我也会继续解决这个存在的问题,解决了再给加到我的知识库里,到时候欢迎大家品读。

下面是这个demo的apk,大家就省去了必要的正确性验证,直接体验,自己觉得好用就参考吧!点我下载测试apk


每天进步一点点!加油!

时间: 2024-10-05 15:45:59

Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制的相关文章

Android开发笔记3之控件

一:编辑框 在res文件夹下的layout的文件夹的xml文件 这样在xml中我们就声明了两个控件,一个EditText和一个TextView <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren

在C#中使用属性控件添加属性窗口

转自原文 在C#中使用属性控件添加属性窗口 第一步,创建在应用程序中将要展现的字段属性为public公有属性.其中,所有的属性必须有get和set的方法(如果不设置get方法,则要显示的属性不会显示在属性控件中).为了设置相关的属性,必须设置下面的一些关于属性控件的属性值,如下表所示: 属性值 含义 CategoryAttribute 该属性对在Property控件中的属性按字母顺序进行归类 DescriptionAttribute 其值为对每个属性的具体文字描述,将会显示在property控件

关于Android PopupWindow中实用Spinner控件点击APP Crash情况整理!

场景异常信息如下: android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:646) at android.view.WindowManagerGlobal.addView(Wi

Android Studio中Button等控件的Text中字符串默认大写的解决方法

初学Android的时候,在Android Studio中xml里面添加一个Button.EditText等控件后,它的Text总是会显示大写,即使你输入的字符串是小写也不行,控制字符串大小写的属性是android:textAllCaps, 最后查看了一下Themes.xml文件,找到了一些端倪,发现在设置样式的时候,默认是把所有的字符串显示大写true. 如图,是从android的Style.xml中的截图,   [解决办法] 1. 把xml中你不想大写的控件添加一行 android:text

WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件进行控制,但对于WinForm则没有这样方便.申明一下,我在这儿所说的改变当前节点的字体与颜色,主要是在WinForm中的TreeView控件,当前选中节点后,其失去鼠标焦点后节点的字体与颜色失去了选中状态,层级一多,我们就不知道当前

android学习笔记(2)EditText控件的学习

对应若水老师的第五课 一,设置一个输入框 添加控件: <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="52dp" <!--本控件顶部距离上一个控件的距离--> /> 二,消除输入框的聚焦 方法一: <EditText android:layout_wi

50个Android开发技巧(12 为控件加入圆角边框)

控件的圆角边框能够使你的App看起来更美观,事实上实现起来也非常easy. (原文地址:http://blog.csdn.net/vector_yi/article/details/24463025) 以创建一个灰色的带圆角边框的Button为例: 一.创建一个ShapeDrawable作为背景 在drawable文件夹下创建一个button_rounded_background.xml文件: <shape xmlns:android = "http://schemas.android.c

牛腩新闻发布系统———如何在开发中使用第三方控件

开发的项目多了以后,很多时候系统自带控件根本不能满足我们的需要,所以有时候就需要我们使用第三方控件来让我们的系统更加Perfect! 下面 ,我记录一下牛腩是如何添加第三方控件的 比如我们要使用 FreeTextBox控件 第一步:先把第三方控件(某个DLL或者其他文件)下载下来 第二步:然后添加对该文件的引用(右击自己的启动项目-添加–引用) 第三步:看到VS左边的工具箱了吗,在空白处右击选择 选择项 第四步:然后会看到如下界面,在单击 浏览,找到自己要添加的第三方控件,确定. 第五步:依次单

Android 布局中 如何使控件居中

首先要分两种不同情况,在两种不同的布局方式下:LinearLayout 和RelativeLayout 1. LinearLayout a). android:layout_gravity="center_horizontal"表示该布局在父布局里水平居中,此时其父布局必须拥有android:orientation="vertical"属性: b). android:layout_gravity="center_vertical"表示该布局在父布