我试图实现一个限制输入到alpha字符[A-Za-z]的EditText.
我从this post开始使用InputFilter方法.当我输入“a%”时,文本消失,如果我退回空格,文本是“a”.我已经尝试过滤器功能上的其他变体,如使用正则表达式仅匹配[A-Za-z],有时会看到像重复字符一样的疯狂行为,我将键入“a”然后键入“b”,然后获取“aab”键入“c”并得到“aabaabc”然后命中空格并获得“aabaabcaabaabc”!
EditText input = (EditText)findViewById( R.id.inputText ); InputFilter filter = new InputFilter() { @Override public CharSequence filter( CharSequence source,int start,int end,Spanned dest,int dstart,int dend ) { //String data = source.toString(); //String ret = null; /* boolean isValid = data.matches( "[A-Za-z]" ); if( isValid ) { ret = null; } else { ret = data.replaceAll( "[@#$%^&*]","" ); } */ /* dest = new SpannableStringBuilder(); ret = data.replaceAll( "[@#$%^&*]","" ); return ret; */ for( int i = start; i < end; i++ ) { if( !Character.isLetter( source.charAt( i ) ) ) { return ""; } } return null; } }; input.setFilters( new InputFilter[]{ filter } );
我完全忍不住在这一个,所以任何帮助在这里将不胜感激.
编辑:
好的,我已经对InputFilter进行了很多实验,并得出了一些结论,尽管没有解决问题.请参阅我的代码中的注释.我现在要尝试Imran Rana的解决方案.
EditText input = (EditText)findViewById( R.id.inputText ); InputFilter filter = new InputFilter() { // It is not clear what this function should return! // Docs say return null to allow the new char(s) and return "" to disallow // but the behavior when returning "" is inconsistent. // // The source parameter is a SpannableStringBuilder if 1 char is entered but it // equals the whole string from the EditText. // If more than one char is entered (as is the case with some keyboards that auto insert // a space after certain chars) then the source param is a CharSequence and equals only // the new chars. @Override public CharSequence filter( CharSequence source,int dend ) { String data = source.toString().substring( start,end ); String retData = null; boolean isValid = data.matches( "[A-Za-z]+" ); if( !isValid ) { if( source instanceof SpannableStringBuilder ) { // This works until the next char is evaluated then you get repeats // (Enter "a" then "^" gives "a". Then enter "b" gives "aab") retData = data.replaceAll( "[@#$%^&*']","" ); // If I instead always returns an empty string here then the EditText is blanked. // (Enter "a" then "^" gives "") //retData = ""; } else { // source is instanceof CharSequence // We only get here if more than 1 char was entered (like "& "). // And again,this works until the next char is evaluated then you get repeats // (Enter "a" then "& " gives "a". Then enter "b" gives "aab") retData = ""; } } return retData; } }; input.setFilters( new InputFilter[]{ filter } );
解决方法
使用以下代码:
EditText input = (EditText) findViewById(R.id.inputText); input.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s,int before,int count) { // TODO Auto-generated method stub for( int i = start;i<s.toString().length(); i++ ) { if( !Character.isLetter(s.charAt( i ) ) ) { input.setText(""); } } } public void beforeTextChanged(CharSequence s,int count,int after) { // TODO Auto-generated method stub } public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } });
如果您希望有效的文本保留在EditText中:
input.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s,int count) { // TODO Auto-generated method stub } public void beforeTextChanged(CharSequence s,int after) { // TODO Auto-generated method stub } public void afterTextChanged(Editable s) { // TODO Auto-generated method stub for( int i = 0;i<s.toString().length(); i++ ) { if( !Character.isLetter(s.charAt( i ) ) ) { s.replace(i,i+1,""); } } } });