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


下面就来看一下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都算一个字数限制,但是其实这样是不对的,所以这篇博客大家可以参考和优化。要是你想拿来用的话最好是输入的内容的类型是单一的才可行,比如都是数字,比如都是汉字,比如都是字符。以后我也会继续解决这个存在的问题,解决了再给加到我的知识库里,到时候欢迎大家品读。