android – EditText和InputFilter会导致重复的文本

前端之家收集整理的这篇文章主要介绍了android – EditText和InputFilter会导致重复的文本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图实现一个限制输入到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,"");               
             }
         }
    }
   });
原文链接:https://www.f2er.com/android/313103.html

猜你在找的Android相关文章