AndroidUI——InputFilter的使用(3)
2016-05-24 18:38
387 查看
在项目中经常会遇到限制EditText输入长度的需求,这个很好解决,设置maxLength属性就行了;但是偶尔会遇到限制长度的升级版:中文算两个字符。比如说这个输入框最多可以输入16个英文字符或8个中文,如果中英文混合输入,那么中文数*2+英文数要小于等于16。
布局文件内容不变
LengthFilter.java
MainActivity.java
布局文件内容不变
LengthFilter.java
package com.wind.demo; import android.text.InputFilter; import android.text.Spanned; public class LengthFilter implements InputFilter { private static final int ASCII = 1; //英文字符长度 private static final int OTHER = 2; //其他字符长度 private final int mMaxLength; //可输入的最大长度 public LengthFilter(int maxLength) { mMaxLength = maxLength; } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { int keep = mMaxLength - countStringLength(dest); //计算剩余可输入的长度 if(keep <= 0) { //剩余可输入的长度不大于0,返回空字符 return ""; } else if(keep >= countStringLength(source)) { //剩余可输入的长度大于输入字符串的长度,不做过滤处理,使用原来的输入字符串 return null; } else { //输入字符串的长度大于剩余可输入的长度 int index = countCutIndex(keep, source); //计算截断输入字符串的位置 return source.subSequence(0, index); //返回截断后的字符串 } } /** * 计算输入字符串的截断位置 * */ private int countCutIndex(int keep, CharSequence source) { int length = 0; for(int i = 0; i < source.length(); i++) { char c = source.charAt(i); length += countCharLength(c); if(length > keep) { return i; } } return source.length() - 1; } /** * 计算字符串的长度 * */ private int countStringLength(CharSequence str) { if(str == null) { return 0; } int length = 0; for(int i = 0; i < str.length(); i++) { char c = str.charAt(i); length += countCharLength(c); } return length; } /** * 计算字符的长度 * */ private int countCharLength(char c) { if(33 <= c && c <= 126) { //英文字符值的范围 return ASCII; } else { return OTHER; } } }
MainActivity.java
package com.wind.demo; import android.app.Activity; import android.os.Bundle; import android.text.InputFilter; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText editText = (EditText) findViewById(R.id.edittext); editText.setFilters(new InputFilter[]{new LengthFilter(16)}); } }
相关文章推荐
- LA_3263_That_Nice_Euler_Circuits_(欧拉定理+计算几何基础)
- AndroidUI——InputFilter的使用(2)
- NDK编译问题: Program "ndk-build" is not found in PATH 和 Unable to launch cygpath. Is Cygwin on the path?
- AndroidUI——InputFilter的使用(1)
- 判断UIImageView中图片是否相同
- shiro添加注解@RequiresPermissions不起作用
- 自定义TabBar中间的Item
- UINavigationController 右滑返回
- 例题9-10 UVa1626&&POJ1141 Brackets Sequence(DP)
- UI进阶 即时通讯之XMPP环境搭建
- php小知识点-文件包含(include include_once require require_once)
- iOS不得姐项目--封装状态栏指示器(UIWindow实现)
- 字典的快速赋值 setValuesForKeysWithDictionary
- 本地推送 UILocalNotification
- Ubuntu 12.04 64位上运行jd-gui
- 顺序查找(Sequential Search)
- UI更新就该放到主线程
- UIControl详解
- 比较2张图片UIImage是否相同
- Missing ios distribution signing identity xcode can request one for you