文档章节

EditText输入时显示千分符“,”,限制输入长度,添加输入限制

wanyang
 wanyang
发布于 2015/03/04 11:21
字数 486
阅读 739
收藏 1
点赞 0
评论 0
1.自定义EditText控件
public class DivisionEditText extends EditText {
    /* 每组的长度 */
    private Integer length = 3;
    /* 分隔符 */
    private String delimiter = ",";

    private String text = "";

    public DivisionEditText(Context context) {
        super(context);
        init();
    }

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

    public DivisionEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    /** 得到每组个数 */
    public Integer getLength() {
        return length;
    }

    /** 设置每组个数 */
    public void setLength(Integer length) {
        this.length = length;
    }

    /** 得到间隔符 */
    public String getDelimiter() {
        return delimiter;
    }

    /** 设置间隔符 */
    public void setDelimiter(String delimiter) {
        this.delimiter = delimiter;
    }

    public String getInputText() {
        return super.getText().toString().replace(getDelimiter(), "");
    }

    /**
     * 初始化
     */
    public void init() {

        // 内容变化监听
        this.addTextChangedListener(new DivisionTextWatcher());
        // 获取焦点监听
        this.setOnFocusChangeListener(new DivisionFocusChangeListener());
    }

    /**
     * 文本监听
     *
     * @author Administrator
     *
     */
    private class DivisionTextWatcher implements TextWatcher {

        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,int count) {
            // 统计个数
            int len = s.length();
            
            // 输入首字母为0之后则不显示
	    if (len > 1) {
		if (s.toString().charAt(0) == '0') {
			editText.setText("0");
			setSelection(1);
			return;
		}
            }
            
            if (len < getLength())// 长度小于要求的数
                return;
            if (count > 1) {
                return;
            }
            if (len > maxLength) {//限制输入的长度
		String str = editText.getText().toString();
		// 截取新字符串
		String newStr = str.substring(0, maxLength);
		text = inversionString(formatSymbol(inversionString(newStr)));
		maxListener.afterLengthMax();//自定义接口,实现监听回调
	    } else {
		//先倒置,运算之后再倒置回来
		text = inversionString(formatSymbol(inversionString(s.toString())));//关键点
	    }
            
           // text = inversionString(formatSymbol(inversionString(s.toString())));
            setText(text);
            setSelection(text.length());
        }
    }
    /**
    * 若有,先去除,进行计算之后再添加
    */  
    private String formatSymbol(String str) {
        char[] chars = str.replace(getDelimiter(), "").toCharArray();
        StringBuffer sb = new StringBuffer();
        
        for (int i = 0; i < chars.length; i++) {
            if (i % getEachLength() == 0 && i != 0)// 每次遍历到4的倍数,就添加一个空格
            {
                sb.append(getDelimiter());
                sb.append(chars[i]);// 添加字符
            } else {
                sb.append(chars[i]);// 添加字符
            }
        }       
        return sb.toString();
    }

    /**
     * 字符串逆序*
     * @param str
     * @return
     */
    private String inversionString(String str) {	
        char[] chars = str.toCharArray();
        StringBuffer sb = new StringBuffer();
        for(int i= 0; i < chars.length; i++) {
            sb.append(chars[chars.length - i - 1]);
        }        
        return sb.toString();
    }

    /**
     * 获取焦点监听
     *
     * @author Administrator
     *
     */
    private class DivisionFocusChangeListener implements OnFocusChangeListener {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                // 设置焦点
                setSelection(getText().toString().length());
            }
        }
    } 
    
    /** EditText 长度最大化监听 */
	public interface OnChangeLengthMaxListener {
		public void afterLengthMax();
	}

	public void setOnChangeLengthMaxListener(OnChangeLengthMaxListener maxListener) {
		this.maxListener = maxListener;
	}

	private OnChangeLengthMaxListener maxListener;
}


© 著作权归作者所有

共有 人打赏支持
wanyang
粉丝 3
博文 29
码字总数 7838
作品 0
徐汇
程序员
怎么在ChemDraw中输入千分号

很多的用户都会使用ChemDraw化学绘图工具来绘制一些化学反应的过程,但是一些化合物中有些元素所占的比例是非常小的,这个时候往往就需要千分号来显示比例。但是在ChemDraw的工具栏上只有百分...

学术研究软件 ⋅ 2016/06/21 ⋅ 0

Android软件开发之EditText 详解(八)

Android软件开发之EditText 详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6629450 EditText在API中的结构 java...

彭博 ⋅ 2012/03/09 ⋅ 0

Android软件开发之EditText 详解(八)

Android软件开发之EditText 详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6629450 EditText在API中的结构 java...

晨曦之光 ⋅ 2012/03/07 ⋅ 0

android输入限制

限制输入框中只能输入自己定义的这些字符串 如果输入其它将不予以显示 android:phoneNumber="true" 限制输入框中只能输入手机号码 android:password="true" 限制输入框中输入的任何内容将以"...

buleberry ⋅ 2014/04/07 ⋅ 0

XYNUOJ 幂字符串

问题 G: 幂字符串时间限制: 1 Sec 内存限制: 32 MB 提交: 23 解决: 10 [提交][状态][讨论版] 题目描述 给你一个字符串,请你判断将此字符串转化成a^n形式的最大的n是多少。 例如:abcd=(abc...

Dear_Jia ⋅ 2017/12/26 ⋅ 0

正则表达式/\B(?=(\d{3})+(?!\d))/怎样给数字添加千分符的

给一串数字添加千分符 我们知道,有一个比较简洁的方式来给一个数字添加千分符,如下: 他是怎么工作的呢?这个正则里面的那一串东西又是用来干嘛的? 元字符B 我们先把这个表达式的主要结构...

Skandar-Ln ⋅ 05/22 ⋅ 0

Android开发之EditText属性详解

1、EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformation...

的书法上的 ⋅ 2014/07/28 ⋅ 0

TextView的API 中文文档

1.1 结构 java .lang.Object ↳ android.view.View ↳ android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextVi......

JavaGG ⋅ 2011/06/30 ⋅ 3

Espresso 2——怎样做!

首先,我使用Google自己的一个例子 场景: 启动一个页面,布局三个控件 1.TextView,里面显示一些文本先 2.EditText,里面让输入姓名 3.Button,按了之后,在1的控件里面显示“hello+姓名” ...

testpioneer ⋅ 2016/07/04 ⋅ 0

Android GridView等控件的属性集合

GridView的一些特殊属性: 1.android:numColumns=”auto_fit” //GridView的列数设置为自动 2.android:columnWidth=”90dp ” //每列的宽度,也就是Item的宽度 3.android:stretchMode=”col...

android开发 ⋅ 2017/12/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 25分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 27分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 38分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 40分钟前 ⋅ 0

我的第一篇个人博客

虽然这是个技术博客,但是,我总是想写一些自己的东西,所有就大胆的在这里写下了第一篇非技术博客。技术博客也很久没有更新,个人原因。 以后自己打算在这里写一些非技术博客,可能个人观点...

Mrs_CoCo ⋅ 41分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 41分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 45分钟前 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 55分钟前 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 59分钟前 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部