文档章节

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

wanyang
 wanyang
发布于 2015/03/04 11:21
字数 486
阅读 911
收藏 1

码上生花,ECharts 作品展示赛正式启动!>>>

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
博文 41
码字总数 7838
作品 0
徐汇
程序员
私信 提问
加载中
请先登录后再评论。
怎么在ChemDraw中输入千分号

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

学术研究软件
2016/06/21
41
0
EditText 集锦 - 开发中常用的用法及遇到的各种坑

前言 EditText ,文本输入框,一个再熟悉不过的的控件,在开发当中,我们需要经常用到。这边文章,主要是记录 EditText 的常用用法,需要的时候可以直接复制张贴,提高效率。同时,本文章会持...

xujun9411
2019/02/21
0
0
EditText 限制输入字符个数的三种方式

最近有个需求是限制用户输入的字符个数,其中中文算2个,非中文字符算1个,比如“1个人”就算5个,当用户输入超过字数限制的时候可以截取并用toast提示用户,这是个非常简单的需求,实现也有...

osc_xvm19j4c
2019/11/30
4
0
四两拨千斤,一招搞定数字格式化问题

问题描述 今天在处理一个数字的格式显示问题时,遇到下面的一些需求: 可以显示千分符 可以显示百分比 可以显示小数位数 如下图,如果勾选的话就使能该项设置。 百分比和小数位数比较好解决,...

osc_1njk964l
04/16
2
0
Android软件开发之EditText 详解(八)

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

彭博
2012/03/09
191
0

没有更多内容

加载失败,请刷新页面

加载更多

TiDB 4.0: The Leading Real-Time HTAP Database is Ready for Cloud

经过一年多的开发,TiDB 4.0 终于迎来 GA 版本,作为 TiDB「面向未来的数据库」道路上面的一个重要的里程碑,TiDB 4.0 不光在稳定性、易用性、性能、云原生等各个方面都有了巨大的进步,新增...

TiDB
15分钟前
7
0
Android | Tangram动态页面之路(七)硬核的Virtualview

何为Virtualview,简单来说,就是通过xml来描述视图,然后压缩成二进制格式,客户端通过解析并渲染成原生view或交由Canvas绘制的过程。 系列文章: 需求背景 Tangram和vlayout介绍 Tangram的...

哈利迪
40分钟前
13
0
深入理解 Java 乱码问题

前言 这段时间在看 TCP/IP 网络通信这块,好奇我的电脑和局域网中电脑怎样通信,又怎样外网通信,Mysql 相关的博客延期执行了。 好久没写博客了,就把以前的博客整理一下,发布到自己的网站上...

万古云霄
42分钟前
27
0
如何监控 Linux 服务器状态?

Linux 服务器我们天天打交道,特别是 Linux 工程师更是如此。为了保证服务器的安全与性能,我们经常需要监控服务器的一些状态,以保证工作能顺利开展。 本文介绍的几个命令,不仅仅适用于服务...

良许Linux
56分钟前
13
0
springboot整合mybatis_plus

码云代码链接: https://gitee.com/liselotte/spring-boot-mp-demo

zhengzhixiang
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部