Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 创建扩展ASCII字符输入过滤器_Android - Fatal编程技术网

Android 创建扩展ASCII字符输入过滤器

Android 创建扩展ASCII字符输入过滤器,android,Android,我使用下面的InputFilter来过滤无效字符(十进制值大于127的ASCII),当输入无效字符时,EditText会显示文本两次。我确实希望EditText显示有效字符,下面是一个示例 -用户在EditText组件中输入XYZ€ -toast消息出现在屏幕上,说明“无效的非Ascii字符” -EditText组件在屏幕上显示xyz,这是我所期望的 -用户输入有效字符,a,因此屏幕显示XYZA -InputFilter运行并返回XYZA,但EditText组件中出现的xyzyza不正确。它复制

我使用下面的InputFilter来过滤无效字符(十进制值大于127的ASCII),当输入无效字符时,EditText会显示文本两次。我确实希望EditText显示有效字符,下面是一个示例

-用户在EditText组件中输入XYZ€
-toast消息出现在屏幕上,说明“无效的非Ascii字符”
-EditText组件在屏幕上显示xyz,这是我所期望的
-用户输入有效字符,a,因此屏幕显示XYZA
-InputFilter运行并返回XYZA,但EditText组件中出现的xyzyza不正确。它复制了XYZ

你知道为什么它会在处理无效字符后复制输入的文本吗

屏幕:

<EditText android:id="@+id/editText"
    android:layout_width="fill_parent" android:layout_height="120dp"
    android:layout_marginTop="10dp" android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp" android:maxLength="45"
    android:focusable="true" android:inputType="text"
    android:cursorVisible="true" android:imeOptions="actionDone"
 />
 InputFilter filter = new InputFilter() {
                        @Override
                        public CharSequence filter(CharSequence source, int start, int end,
                                Spanned dest, int dstart, int dend) {

                            if (source instanceof SpannableStringBuilder) {
                                SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
                                for (int i = end - 1; i >= start; i--) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                     if (ascii > 127) {    
                                         sourceAsSpannableBuilder.delete(i, i+1);
                                         toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);
                                     }     
                                }
                                return source;
                            } else {
                                StringBuilder filteredStringBuilder = new StringBuilder();
                                for (int i = 0; i < end; i++) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                    if (ascii <= 127) {    
                                        filteredStringBuilder.append(currentChar);
                                    }     
                                }
                                return filteredStringBuilder.toString();
                            }
                        }
                    };

活动:

public class EditTextActivity extends Activity {        

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        EditText eText = (EditText) findViewById(R.id.editText);
        setAsciiTextFilter();
    }    

    private void setAsciiTextFilter() {

              InputFilter filter = new InputFilter() {

                    int asciiNo;

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

                        for (int i = start; i < end; i++) {

                            asciiNo = source.charAt(i);

                            if(asciiNo > 127) {       

                                toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);

                                //Replace the invalid ascii character with empty String
                                return source.toString().replace(source.charAt(i)+"", "");
                            }    
                        }
                        return null;
                    }
                };


           eText.setFilters(new InputFilter[]{filter}); 
    }
}
公共类EditTextActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
EditText-eText=(EditText)findViewById(R.id.EditText);
setAsciiTextFilter();
}    
私有void setAsciiTextFilter(){
InputFilter筛选器=新的InputFilter(){
内特阿西诺;
@凌驾
公共CharSequence筛选器(CharSequence源、int开始、int结束、,
跨越目的地、内部数据起点、内部数据起点){
for(int i=start;i127){
toast=multility.showtoost(“无效的非Ascii字符”,toast.LENGTH\u SHORT);
//用空字符串替换无效的ascii字符
返回source.toString();
}    
}
返回null;
}
};
setFilters(新的InputFilter[]{filter});
}
}
新尝试:

<EditText android:id="@+id/editText"
    android:layout_width="fill_parent" android:layout_height="120dp"
    android:layout_marginTop="10dp" android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp" android:maxLength="45"
    android:focusable="true" android:inputType="text"
    android:cursorVisible="true" android:imeOptions="actionDone"
 />
 InputFilter filter = new InputFilter() {
                        @Override
                        public CharSequence filter(CharSequence source, int start, int end,
                                Spanned dest, int dstart, int dend) {

                            if (source instanceof SpannableStringBuilder) {
                                SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
                                for (int i = end - 1; i >= start; i--) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                     if (ascii > 127) {    
                                         sourceAsSpannableBuilder.delete(i, i+1);
                                         toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);
                                     }     
                                }
                                return source;
                            } else {
                                StringBuilder filteredStringBuilder = new StringBuilder();
                                for (int i = 0; i < end; i++) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                    if (ascii <= 127) {    
                                        filteredStringBuilder.append(currentChar);
                                    }     
                                }
                                return filteredStringBuilder.toString();
                            }
                        }
                    };
InputFilter过滤器=新的InputFilter(){
@凌驾
公共CharSequence筛选器(CharSequence源、int开始、int结束、,
跨越目的地、内部数据起点、内部数据起点){
if(SpannableStringBuilder的源实例){
SpannableStringBuilder sourceAsSpannableBuilder=(SpannableStringBuilder)源;
对于(inti=end-1;i>=start;i--){
char currentChar=源字符(i);
int ascii=当前字符;
如果(ascii>127){
sourceAsSpannableBuilder.delete(i,i+1);
toast=multility.showtoost(“无效的非Ascii字符”,toast.LENGTH\u SHORT);
}     
}
返回源;
}否则{
StringBuilder filteredStringBuilder=新建StringBuilder();
对于(int i=0;i如果(ascii)已编辑:

<EditText android:id="@+id/editText"
    android:layout_width="fill_parent" android:layout_height="120dp"
    android:layout_marginTop="10dp" android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp" android:maxLength="45"
    android:focusable="true" android:inputType="text"
    android:cursorVisible="true" android:imeOptions="actionDone"
 />
 InputFilter filter = new InputFilter() {
                        @Override
                        public CharSequence filter(CharSequence source, int start, int end,
                                Spanned dest, int dstart, int dend) {

                            if (source instanceof SpannableStringBuilder) {
                                SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
                                for (int i = end - 1; i >= start; i--) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                     if (ascii > 127) {    
                                         sourceAsSpannableBuilder.delete(i, i+1);
                                         toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);
                                     }     
                                }
                                return source;
                            } else {
                                StringBuilder filteredStringBuilder = new StringBuilder();
                                for (int i = 0; i < end; i++) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                    if (ascii <= 127) {    
                                        filteredStringBuilder.append(currentChar);
                                    }     
                                }
                                return filteredStringBuilder.toString();
                            }
                        }
                    };
我认为问题在于您返回的是整个字符串,而您只应返回该字符的替换项。
filter()
在文本更改时运行,不一定会替换
EditText
中的整个字符串。您需要注意这一点,以免最终将整个字符串推到字符应该去的地方

是相关的(只需将非ascii替换为非字母数字),并且那里的答案是公认的,因此您应该能够使用它来获得您想要的


很抱歉回答/删除的问题让人困惑。我在离开家之前就回答了。几分钟后,我意识到我的逻辑有一个巨大的缺陷,所以我跳上手机并删除了它。我讨厌在手机上键入完整的答案,所以它只需要等待一点。

我发现使用单个for循环和答案更好

还请注意,将源代码传递给SpannableStringBuilder构造函数以从源代码复制跨距是很重要的。如果不这样做,那么事情就会变得不稳定

    @Override
    public CharSequence filter(CharSequence source, int start,
            int end, Spanned dest, int dstart, int dend) {
        SpannableStringBuilder ret;

        if (source instanceof SpannableStringBuilder) {
            ret = (SpannableStringBuilder)source;
        } else {
            ret = new SpannableStringBuilder(source);
        }

        for (int i = end - 1; i >= start; i--) {
            char currentChar = source.charAt(i);
            char currentChar = source.charAt(i);
            int ascii = currentChar;
            if (ascii > 127) {    
                ret.delete(i, i+1);
                toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);
            }     
        }

        return ret;
    }

谢谢你的回答。我使用了你的建议并更新了上面的代码(在新的尝试:部分)。一旦输入了无效字符,toast将继续显示,即使是有效字符,因为sourceAsSpannableBuilder.delete(I,I+1);每次都不断删除无效字符。sourceAsSpannableBuilder似乎会保留无效字符,即使EditText没有显示它。有没有办法只在输入无效字符时显示toast?感谢所有帮助…如果(end==i+1){//show toast}有效,请忽略上面的问题