自定义控件--史上最简单!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下载地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机网络期末复习题 201708-201801计算机网络复习指导发布-校考学生!!下载截止于12.5日晚上9点 2017-12-04 23:07 计算机网络复习指导-校内考试 §1.名词解释: 1. 计算机网络 2.网络体系结构 3.高速以太网 4.静态路由选择 5. 动态路由选择 6.子网掩码 8.动态主机配置协议 9.套接字 10.客户/服务器模型(C/S模型) 11.域名系统(DNS) 12.光纤分布式数据接口FDDI §2.简答题: 1.试谈你对网络安全的威胁和防病毒技术的认识。(线下教学课件) 2.简述物理层的四个特性。(线下教学课件) 3.计算机网络的组成(P2-P3) 4.计算机网络的功能(P3) 5.计算机网络标准化的相关组织(P4+线下教学课件) 6.计算机网络的性能指标(P8+线下教学课件) 7.简述你所知道的网络传输介质(P33-34) 8.物理层的四个特性(P34) 9.简述四种帧边界的划分方法(即组帧方法)。(P52-54+线下教学课件) 10.简述停止-等待流量控制(协议)。(P59+P62-P64+线下教学课件) 11.简述时分多路复用(P69+线下教学课件) 12.简述频分多路复用(P68+线下教学课件) 13.简述IPv4地址的分类(P122-123) 14.UDP数据报与IP分组的区别(P187) §3.论述题: 1.试说明数据链路层原语和协议的转换。(线下教学课件) 2.描述常规释放的过程,并画出其示意图。(线下教学课件) 3.奈奎斯特定理公式和香农定理公式的主要区别是什么? 4.试比较电路交换、报文交换和分组交换等三种数据传输方式。(P27-29) 5.谈谈你对差错控制方法的理解。(P54-58+线下教学课件) 6.谈谈域名解析过程(P225-226) 7.ARP和DNS是否有些相似?它们有何区别?(P227) 8.FTP的工作原理。(P228)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值