自定义控件--史上最简单!EditText多行输入并控制最大输入字符,显示剩余输入字符

转载请注明出处,谢谢~~

昨天我在网上查看一些关于EditText的控制输入字符的问题。总结了一下有这么几种:

1.通过监听器TextWatcher监听字符数,然后通过弹出窗口阻断输入。

2.通过给EditText设置InputFilter.LengthFilter,来实现最大输入字符,阻断输入。

3.通过TextWather实现控制最大输入。

然后我看了看他们的实现,然后的然后,我放弃了。我不喜欢这种方式,并不是这种方式不可以。因为他们或有限制,或代码麻烦,我崇尚自由(我在装X,发现了没,哈哈)。



(以上言论都是在奠定一个安静的装X的气氛,忽略忽略~~)



然后我复写了一个EditText,打印了它所有的方法(这个可以自己试下,注意复写EditText,不要复写TextView。),发现了一个奇怪但是令人振奋的现象:getText()一直在被调用。(后来想想也是应该的)

我们输入的过程中,是这样的:

图中5是我输入一串汉字。OK,那一切就明了了!

public class ControlNumEditText extends EditText {

    private int MAX_NUM = 120;

    public interface onTextEditListener{
        public void textChanged(int cur_num);
    };

    private onTextEditListener listener;

    public void setOnTextEditListener(onTextEditListener listener) {
        this.listener = listener;
    }

    public ControlNumEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ControlNumEditText(Context context) {
        super(context);
    }

    public int getMaxNum() {
        return MAX_NUM;
    }

    public void setMaxNum(int num) {
        this.MAX_NUM = num;
    }

    @Override
    public Editable getText() {
        Editable text = super.getText();
        int cur_num = (int) calculateLength(text);

        if (cur_num > MAX_NUM) {
            text.delete(MAX_NUM+1,cur_num);//限制输入 Text limits.
            cur_num = MAX_NUM;//返回最大值 Tell the listener current number.
        }

        if (listener != null) {
            listener.textChanged(cur_num);
        }

        return super.getText();
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);
    }

    /**
     * 判断字符数
     * Get the char number.
     * @param text
     * @return
     */
    private long calculateLength(CharSequence text) {
        double len = 0;
        for (int i = 0; i < text.length(); i++) {
            int tmp = (int) text.charAt(i);
            if (tmp > 0 && tmp < 127) {
                len += 0.5;
            } else {
                len++;
            }
        }
        return Math.round(len);
    }
}

这是控件的所有代码,set/get方法可以设置最大字符MAX_NUM。listener可以实现对已输入字符的回调,回调给你需要显示的Activity。

getText方法内,我们通过super.getText()可以得到这个输入的字符串,然后通过calculateLength()方法来计算字符个数,这里是把字母和数字都当做半个字符对待,实现方式是通过判断ASCII,我前边写过一个工具类,如何判断当前字符组成,那里边就用到了这一种方式。

判断之后我们将多余的字符干掉,然后把MAX_NUM赋给当前字符,然后调用listener的方法返回给回调,这样就保证了回调的正确性。然后再将回调的值赋给TextView用来显示。一切就ok了。

多说一句,多行的EditText默认是从中间开始输入的,想从左上角输入,在XML文件中把EditText的gravity设置为top就行。

github Demo下载地址

CSDN Demo下载地址

时间: 2024-08-02 12:23:16

自定义控件--史上最简单!EditText多行输入并控制最大输入字符,显示剩余输入字符的相关文章

Android 自定义控件打造史上最简单的侧滑菜单

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39185641 ,本文出自[张鸿洋的博客] 侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现:多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最

史上最简单的带流控功能的http server

s.py import time import SimpleHTTPServer import SocketServer BYTES_PER_SECOND=160*1024 class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): def do_GET(self): """Serve a GET request.""" f = self.send_head() i

史上最简单的软件破解——5行脚本代码完美破解99%的过期软件

如果你看到了这篇博文,绝对保证不虚此行.仅仅5行脚本代码,即可破解99%的过期软件. 这件事的背景:最近在找了一些学习资料,其中有Rational Rose画的图,好久没用过它了.今天安装好,导入许可文件,结果问题出现了,提示没有激活.怎么回事??仔细一看,原来许可文件到2013年12月份就过期了(乌鸦飘过...) 在网上找了半天也没有找到一个新的许可文件,结果一狠心,手动改了一下日期,再启动,ok了,把时间再改回来.本来事儿到这儿就完了.但是结果光今天一天就手动改了好几次系统时间,这就太让人无

Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现

本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8714621 人人客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示. 据说人人客户端的这个特效是从facebook客户端模仿来的,至于facebook是不是又从其它地方模仿来的就不得而知了.好,今天我们就一起来实现这个效果,总之我第一次看到这个特效是在人人客户端看到的,我

史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

最新Finchley版本请访问:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/或者http://blog.csdn.net/forezp/article/details/81040925 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环境简单,可以在开发人员的电脑上跑.另外说明spring cl

史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发

书是人类进步的阶梯. ——高尔基 习大大要求新新人类要有中国梦,鼓励大学生们一毕业就创业.那最好的创业途径是什么呢?就是APP.<构建跨平台APP-jQuery Mobile移动应用实战>就是一本写给没钱没身份没资历的创业小白看的APP书,看完这本书你可以拥有自己的一个APP,不用花钱就能移植到其他移动平台,支持iOS,Android,Windows Phone!!!!!!!!找个最便宜的来练手吧!  小白APP交流Q群:  348632872 清华大学出版社推出的<构建跨平台APP:j

史上最简单的 Spring MVC 教程(十)

1 前言 在史上最简单的 Spring MVC 教程(九)中,咱们已经实现了图片的上传及显示功能,那么接下来,在本篇博文中,咱们更进一步,以实体类(Person)中的字段"name"和控制器(PersonController)中的方法 updatePersonList 为例,实现参数的校验功能. 2 注解示例 - 参数校验 老规矩,首先给出项目结构图: 在给出代码之前, 咱们先明确参数校验的步骤: 导入参数校验的 jar 包: 在实体上配置需要校验的属性: 在控制器的方法中用注解 @V

史上最简单的 MyBatis 教程

1 前言 MyBatis 源于 Apache 的一个开源项目 iBatis,而 iBatis 一词则来源于"internet"和"abatis"的组合,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为MyBatis ,2013年11月其又迁移到 Github.MyBatis 是一个基于 Java 的支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架,相比于基于面向对象使用 HQL 语言的

史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。

重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView.ListView,而是任意的ViewGroup里的childView都可以使用侧滑(删除)菜单.支持任意ViewGroup.0耦合.史上最简单. 概述 本控件从撸出来在项目使用至今已经过去7个月,距离第一次将它push至github上,也已经2月+.(之前,我发表过一篇文章.传送门:http://b