android string 过滤,Android 字符串过滤器InputFilter详解
概述
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详解相关推荐
- Android系统(96)---Android 数据交换解析框架Gson使用详解
Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...
- Android JNI使用方法,JNI机制详解
Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...
- Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调
Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...
- Android进阶笔记:Messenger源码详解
Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...
- android组件用法说明,Android第三方控件PhotoView使用方法详解
Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...
- Android低功耗蓝牙(BLE)使用详解
代码地址如下: http://www.demodashi.com/demo/13390.html 与普通蓝牙相比,低功耗蓝牙显著降低了能量消耗,允许Android应用程序与具有更严格电源要求的BLE设 ...
- android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解
Android适配底部虚拟按键的方法详解 发布时间:2020-10-09 05:26:12 来源:脚本之家 阅读:171 作者:yuanzhihui123 最近项目进行适配的时候发现部分(如华为手机) ...
- Android性能优化之APK瘦身详解(瘦身73%)
image 公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段. ...
- android多渠道打包插件,Android几种多渠道打包的步骤详解
1.什么是多渠道打包 在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包.在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的 ...
最新文章
- [ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器
- (转)upper_bound()与lower_bound()使用方法
- mysql 基础sql
- string_view理解与用法(二)
- flume的配置和开启
- opencv特征提取1-Harris角点检测
- 系统运维tips 3 之 innodb
- google地球无法连接_WiFi无法连接?解决macOS Big Sur/Mojave/ Catalina上的Wi-Fi问题
- 深度学习(tensorflow+keras)性能问题
- MySQL JOIN连接用法
- PTA 基础练习答案
- TensorFlow 安装与环境配置
- ubuntu teamviewer
- Linux 命令 poll 和 ppoll 详解 + 实例
- .NET/C# 生成二维码
- android三级联动、四级联动(地区选择)
- ASP.NET中使用uedit遇到的坑们
- 持续集成/持续部署(1)Git Gitlab
- 因为是程序员,被亲戚鄙视了!
- linux分区命名规则,《linux就该这么学》第七节课:文件的各种权限以及linux分区命名规则...
热门文章
- 神舟linux装win7教程,神舟笔记本win10系统改win7系统详细图文步骤
- FRAM 铁电存储器
- html5怎么让图片垂直居中显示,css中如何实现图片垂直居中显示?
- [经验教程]支付宝好友被删除了怎么知道及支付宝好友删除是单向还是双向?
- 一文详解:TMP1750芯片 三通道线性LED驱动器
- VisualGDB可视化调试STL
- 西交计算机科学与技术学院,2021年“工科大学”专业排名,哈工大、西安交大、华科进入前20名...
- OPPO号召力如此巨大,R11发布会邀来半个娱乐圈
- Asky极简教程:零基础1小时学编程,已更新前8节
- 06 “eden没有发生minor gc, 对象直接分配在了old gen“ 的调试