EditText 使用TextWatcher接口输入有效值(数值或金额)
2018-01-05 13:34
561 查看
数据上传到服务器,需要对数据的值进行限制,EditText在输入时做限制。使用TextWatcher接口。
可以限制小数点前位数和小数点后位数 。
public class MyWatcher implements TextWatcher{
private int beforeDot;
private int afterDot;
private int cursor=0;//记录光标的位置
/**
* 构造器
*
* @param beforeDot 小数点前位数 不限制输入-1
* @param afterDot 小数点后位数 不限制输入-1
*/
public MyWatcher(int beforeDot, int afterDot) {
this.beforeDot = beforeDot;
this.afterDot = afterDot;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
cursor = start;
}
@Override
public void afterTextChanged(Editable s) {
judge(s);
}
private void judge(Editable editable) {
String temp = editable.toString();
int posDot = temp.indexOf(".");//小数点的位置
//直接输入小数点的情况
if (posDot == 0) {
editable.insert(0, "0");
return;
}
//输入-.的情况
if (temp.startsWith("-")&&posDot == 1){
editable.insert(1, "0");
return;
}
if (cursor!=0){
if (temp.length()>cursor){
String s = temp.substring(cursor,cursor+1);
if (s.equals("-")){//不是首位时输入"-"
editable.delete(cursor,cursor+1);
return;
}
if (cursor!=temp.indexOf(".")){
if (s.equals(".")){//已有"."后在输入"."
editable.delete(cursor,cursor+1);
return;
}
}else{
String substring = temp.substring(temp.indexOf(".")+1, temp.length());
if (substring.contains(".")){//已有"."前在输入"."
editable.delete(temp.indexOf(".")+substring.indexOf("."),temp.indexOf(".")+substring.indexOf(".")+1);
return;
}
}
}
}
//输入"08" 等类似情况
if (temp.startsWith("0") && temp.length() > 1 && (posDot == -1 || posDot > 1)) {
editable.delete(0, 1);
return;
}
//输入"-08" 等类似情况
if (temp.startsWith("-0") && temp.length() > 2 && (posDot == -1 || posDot > 2)) {
editable.delete(1, 2);
return;
}
if (posDot < 0 && beforeDot != -1) {
//不包含小数点 限制小数点前位数,含"-" 位数加1
if (temp.startsWith("-")) {
if (temp.length() > beforeDot+1) {
editable.delete(beforeDot, beforeDot + 1);
}
}else{
if (temp.length() > beforeDot) {
editable.delete(beforeDot, beforeDot + 1);
}
}
return;
}else if (posDot > 0 && beforeDot != -1){
//包含小数点 限制小数点前位数 含"-" 位数加1
if (temp.startsWith("-")){
if (posDot>beforeDot+1){
editable.delete(cursor, cursor + 1);
}
}else{
if (posDot>beforeDot){
editable.delete(cursor, cursor + 1);
}
}
}
//如果包含小数点 限制小数点后位数
if (temp.length() - posDot - 1 > afterDot && afterDot != -1) {
editable.delete(posDot + afterDot + 1, posDot + afterDot + 2);//删除小数点后多余位数
}
}
}
注册监听:
EditText mEditor = (EditText)findViewById(R.id.editor_input);
mEditor.addTextChangedListener(mTextWatcher);
可以限制小数点前位数和小数点后位数 。
public class MyWatcher implements TextWatcher{
private int beforeDot;
private int afterDot;
private int cursor=0;//记录光标的位置
/**
* 构造器
*
* @param beforeDot 小数点前位数 不限制输入-1
* @param afterDot 小数点后位数 不限制输入-1
*/
public MyWatcher(int beforeDot, int afterDot) {
this.beforeDot = beforeDot;
this.afterDot = afterDot;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
cursor = start;
}
@Override
public void afterTextChanged(Editable s) {
judge(s);
}
private void judge(Editable editable) {
String temp = editable.toString();
int posDot = temp.indexOf(".");//小数点的位置
//直接输入小数点的情况
if (posDot == 0) {
editable.insert(0, "0");
return;
}
//输入-.的情况
if (temp.startsWith("-")&&posDot == 1){
editable.insert(1, "0");
return;
}
if (cursor!=0){
if (temp.length()>cursor){
String s = temp.substring(cursor,cursor+1);
if (s.equals("-")){//不是首位时输入"-"
editable.delete(cursor,cursor+1);
return;
}
if (cursor!=temp.indexOf(".")){
if (s.equals(".")){//已有"."后在输入"."
editable.delete(cursor,cursor+1);
return;
}
}else{
String substring = temp.substring(temp.indexOf(".")+1, temp.length());
if (substring.contains(".")){//已有"."前在输入"."
editable.delete(temp.indexOf(".")+substring.indexOf("."),temp.indexOf(".")+substring.indexOf(".")+1);
return;
}
}
}
}
//输入"08" 等类似情况
if (temp.startsWith("0") && temp.length() > 1 && (posDot == -1 || posDot > 1)) {
editable.delete(0, 1);
return;
}
//输入"-08" 等类似情况
if (temp.startsWith("-0") && temp.length() > 2 && (posDot == -1 || posDot > 2)) {
editable.delete(1, 2);
return;
}
if (posDot < 0 && beforeDot != -1) {
//不包含小数点 限制小数点前位数,含"-" 位数加1
if (temp.startsWith("-")) {
if (temp.length() > beforeDot+1) {
editable.delete(beforeDot, beforeDot + 1);
}
}else{
if (temp.length() > beforeDot) {
editable.delete(beforeDot, beforeDot + 1);
}
}
return;
}else if (posDot > 0 && beforeDot != -1){
//包含小数点 限制小数点前位数 含"-" 位数加1
if (temp.startsWith("-")){
if (posDot>beforeDot+1){
editable.delete(cursor, cursor + 1);
}
}else{
if (posDot>beforeDot){
editable.delete(cursor, cursor + 1);
}
}
}
//如果包含小数点 限制小数点后位数
if (temp.length() - posDot - 1 > afterDot && afterDot != -1) {
editable.delete(posDot + afterDot + 1, posDot + afterDot + 2);//删除小数点后多余位数
}
}
}
注册监听:
EditText mEditor = (EditText)findViewById(R.id.editor_input);
mEditor.addTextChangedListener(mTextWatcher);
相关文章推荐
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- TextWatcher接口的使用:监听EditText文字变动事件
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- Android TextWatcher监控EditText中的输入内容并限制其输入字符个数
- 使用EditText+ListView并结合TextWatcher实现关键字筛选
- Android实现EditText输入金额
- 安卓控件使用系列6:EditText控制输入的字符范围
- 【问题】在TabHost以外的EditText不能使用硬件盘输入数字
- Android TextWatcher监控EditText中的输入内容并限制其输入字符个数
- Android开发输金额EditText输入控制
- 安卓控件使用系列5:EditText输入表情图片
- 使用TextWatcher监听EditText变化
- EditText输入金额格式
- Android TextWatcher监控EditText中的输入内容并限制其输入字符个数