最近的工作需要自己写一个数字键盘用于数字的输入,采用的方法是自定义一个  Dialog,然后将数字显示在EditText中。在处理过程中遇到遇到一个问题,在EditText的点击事件中屏蔽系统键盘并弹出自定义的Dialog,无法获取用户选中的字符即Selection,造成的问题现象是用户不能选中中间某个位置修改输入值。

  为了解决这一问题,需要在EditText的点击事件中获取Selection。

  解决方法是:1、在EditText点击事件中获取用户点击位置,主要取其中的touchX值(这里主要讨论文字方向为横排的情况);

        2、获取EditText的内边距paddingLeft值(包含左内边距和右内边距,此处仅讨论左对齐情况);

        3、获取文字大小textSize(此值得大小与XML文件中设置的大小和单位有关系,最好使用sp。使用getTextSize方法得到的值是已经经过系统字体大小加权后的值,但不是实际显示的字体大小,实际字体大小应该通过此值乘以textScaleX得到。默认情况下得到的单位为px,其他情况可以使用getTextSize重载的另一个方法,根据单位返回相应的值);

        4、获取EditText的textScaleX(这个值用于计算字体显示的实际大小);

  获取以上值之后就可以来计算字符的实际大小。这里说明一下:汉字、数字、大写字母、小写字母显示大小是不同的,其中汉字大小为textSize*textScaleX,数字大小为textSize*textScaleX/2,字母的大小与具体字母有关。此处仅使用数字来讨论。

  数字大小计算公式:numSize = textSize*textScaleX/2*1.1;//此处乘以1.1的作用是加上数字之间的间隔距离,通过实际测量计算,字符之间间隔是字符大小的0.1倍

  光标位置计算: selection = (int)((touchX - paddingLeft)/(numSize ));//此处直接取整,可将光标定位到第一个字符之前

  另外应检查selection 是否超出EditText中实际字符长度或小于0,并进行相应处理。