概述

InputFilter是系统提供的一个接口,里面只有一个方法filter(),用于过滤输入/插入的字符串,返回值为CharSequence。 一般都是通过判断语句来过滤字符串,在这里 InputFilter 是另外一种实现方式。

实现

代码

/******************************* 输入框关联 *********************************/

et02.setFilters(filter);

/**********************************调用**************************************/

private InputFilter[] filter = new InputFilter[] {

new InputFilter() {

/**

* @param source 输入的文字

* @param start 输入-0,删除-0

* @param end 输入-文字的长度,删除-0

* @param dest 原先显示的内容

* @param dstart 输入-原光标位置,删除-光标删除结束位置

* @param dend 输入-原光标位置,删除-光标删除开始位置

* @return

*/

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

System.out.println("source =="+ source+" start====="+start+" end======"+end+" dest===="+dest+" dstart==="+dstart+" dend=="+dend);

return null;

}

}

};

Log

/*******************************输入********************************/

09-09 09:30:18.977 10843-10843/zp.example.zptext I/System.out: source ==我 start=====0 end======1 dest==== dstart===0 dend==0

09-09 09:30:21.873 10843-10843/zp.example.zptext I/System.out: source ==喜欢 start=====0 end======2 dest====我 dstart===1 dend==1

09-09 09:30:26.817 10843-10843/zp.example.zptext I/System.out: source ==湖畔 start=====0 end======2 dest====我喜欢 dstart===3 dend==3

09-09 09:31:10.265 10843-10843/zp.example.zptext I/System.out: source ==的 start=====0 end======1 dest====我喜欢湖畔 dstart===5 dend==5

/************************************删除*****************************/

09-09 09:33:08.089 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜欢湖畔的 dstart===5 dend==6

09-09 09:33:22.341 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜欢湖畔 dstart===4 dend==5

09-09 09:33:27.733 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜欢湖 dstart===3 dend==4

09-09 09:33:30.269 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜欢 dstart===2 dend==3

09-09 09:33:31.485 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜 dstart===1 dend==2

09-09 09:33:32.777 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我 dstart===0 dend==1

使用

private InputFilter[] filter = new InputFilter[] {

new InputFilter() {

/**

* @param source 输入的文字

* @param start 输入-0,删除-0

* @param end 输入-文字的长度,删除-0

* @param dest 原先显示的内容

* @param dstart 输入-原光标位置,删除-光标删除结束位置

* @param dend 输入-原光标位置,删除-光标删除开始位置

* @return

*/

// 不让输入框输入内容

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

return null;

}

},

/**这里限制输入的长度为5个字母*/

new InputFilter.LengthFilter(5),

/**输入小写转换成大写*/

new InputFilter.AllCaps()

};

实例一

// 只要你输入内容都会替换成“I LOVE YOU”,删除 - 正常删除

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

if (end > 0){

return "I LOVE YOU";

}else {

return null;

}

}

实例二

// 控制不让输入空格,不让输入数字大于13位(解决手机号输入问题)

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

if(source.equals(" ") || source.toString().contentEquals("\n") || dstart == 13)return "";

else return null;

}

实例三

// 不让输入框输入内容(禁止输入)

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

return dest.subSequence(dstart,dend);

}

实例四

类似临摹,输入字符正确则正常输入,不正确则用 x 代替

/*****************************配置******************************/

private final String str = "Hello,Android!";

et03.setFilters(new InputFilter[]{ new MyInputFilter(str) });

/***************************代码实现***************************/

public class MyInputFilter implements InputFilter {

String str = null;

public MyInputFilter(String str) {

this.str = str;

}

@Override

public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {

String ch = null;

if (dest.length() < str.length()) {

ch = str.substring(dstart + start, dstart + end);

} else {

return dest.subSequence(dstart, dend);

}

if (ch.equals(src)) {

Toast.makeText(TextWatchActivity.this, "match", Toast.LENGTH_SHORT).show();

return dest.subSequence(dstart, dend) + src.toString();

} else {

Toast.makeText(TextWatchActivity.this, "mismatch", Toast.LENGTH_SHORT).show();

return dest.subSequence(dstart, dend) + "×";

}

}

}

实例五

/**只允许输入某些字符*/

et03.setKeyListener(new NumberKeyListener() {

@Override

public int getInputType() {

return InputType.TYPE_MASK_VARIATION;

}

/**这里实现字符串过滤,把你允许输入的字母添加到下面的数组即可!*/

@Override

protected char[] getAcceptedChars() {

return new char[]{'0','1','2','3'};

}

});

实例六

实时格式化金额,三位一断

/*******************************配置************************************/

et03.setFilters(new InputFilter[]{lengthfilter2});

/*******************************实现************************************/

private DecimalFormat myformat = new DecimalFormat("###,###"); //金额的格式

private InputFilter lengthfilter2 = new InputFilter() {

@Override

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

// 删除等特殊字符,直接返回

// "".equals(source.toString():不添加会出现删除不了内容的情况

if (source.toString() == null || source.toString().contains(".") || "".equals(source.toString())) {

return null;

}

String dValue = dest.toString();

if (dValue != null && dValue.contains(",")) {

dValue = dValue.replace(",", "");

}

if (dValue != null && dValue.length() > 2 && !dValue.contains(",")) {

String newValue = dValue + source;

String amountStr = myformat.format(Double.parseDouble(newValue));

et03.setText("");

et03.setText(amountStr);

et03.setSelection(amountStr.length());

return amountStr;

} else {

return null;

}

}

};

android string 过滤,Android 字符串过滤器InputFilter详解相关推荐

  1. Android系统(96)---Android 数据交换解析框架Gson使用详解

    Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...

  2. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

  3. Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调

    Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...

  4. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  5. android组件用法说明,Android第三方控件PhotoView使用方法详解

    Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...

  6. Android低功耗蓝牙(BLE)使用详解

    代码地址如下: http://www.demodashi.com/demo/13390.html 与普通蓝牙相比,低功耗蓝牙显著降低了能量消耗,允许Android应用程序与具有更严格电源要求的BLE设 ...

  7. android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解

    Android适配底部虚拟按键的方法详解 发布时间:2020-10-09 05:26:12 来源:脚本之家 阅读:171 作者:yuanzhihui123 最近项目进行适配的时候发现部分(如华为手机) ...

  8. Android性能优化之APK瘦身详解(瘦身73%)

    image 公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段. ...

  9. android多渠道打包插件,Android几种多渠道打包的步骤详解

    1.什么是多渠道打包 在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包.在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的 ...

最新文章

  1. [ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器
  2. (转)upper_bound()与lower_bound()使用方法
  3. mysql 基础sql
  4. string_view理解与用法(二)
  5. flume的配置和开启
  6. opencv特征提取1-Harris角点检测
  7. 系统运维tips 3 之 innodb
  8. google地球无法连接_WiFi无法连接?解决macOS Big Sur/Mojave/ Catalina上的Wi-Fi问题
  9. 深度学习(tensorflow+keras)性能问题
  10. MySQL JOIN连接用法
  11. PTA 基础练习答案
  12. TensorFlow 安装与环境配置
  13. ubuntu teamviewer
  14. Linux 命令 poll 和 ppoll 详解 + 实例
  15. .NET/C# 生成二维码
  16. android三级联动、四级联动(地区选择)
  17. ASP.NET中使用uedit遇到的坑们
  18. 持续集成/持续部署(1)Git Gitlab
  19. 因为是程序员,被亲戚鄙视了!
  20. linux分区命名规则,《linux就该这么学》第七节课:文件的各种权限以及linux分区命名规则...

热门文章

  1. 神舟linux装win7教程,神舟笔记本win10系统改win7系统详细图文步骤
  2. FRAM 铁电存储器
  3. html5怎么让图片垂直居中显示,css中如何实现图片垂直居中显示?
  4. [经验教程]支付宝好友被删除了怎么知道及支付宝好友删除是单向还是双向?
  5. 一文详解:TMP1750芯片 三通道线性LED驱动器
  6. VisualGDB可视化调试STL
  7. 西交计算机科学与技术学院,2021年“工科大学”专业排名,哈工大、西安交大、华科进入前20名...
  8. OPPO号召力如此巨大,R11发布会邀来半个娱乐圈
  9. Asky极简教程:零基础1小时学编程,已更新前8节
  10. 06 “eden没有发生minor gc, 对象直接分配在了old gen“ 的调试