2

在我的活动中,我有一个 EditText 来捕获文件名。我正在使用 TextWatcher 来防止用户输入我不希望他们在文件名中使用的某些字符。本质上,我只希望用户输入以下字符:[a-zA-Z_0-9]。

@Override
public void afterTextChanged(Editable text) {
    String textStr = text.toString();
    int length = text.length();

    if (!Pattern.matches("\\w*", textStr)) {
        text.delete(length-1, length);
    }
}

编辑:在 onCreate(...) 添加更多代码

fileNameEditText = (EditText)findViewById(R.id.UploadPhoto_fileNameEditText);
fileNameEditText.addTextChangedListener(this);

在布局 xml 文件中

<EditText
 android:id="@+id/UploadPhoto.fileNameEditText"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:layout_marginBottom="20sp"
 android:layout_marginRight="10sp"
 android:layout_toRightOf="@id/UploadPhoto.fileNameLabel"/>

通过防止用户输入诸如“\”和“.”之类的内容,这非常有效。我遇到的问题是,如果他们键入这些字符,它们就会出现在单词建议框中。这有点烦人,因为如果您尝试使用退格键删除一个字符,它会首先从建议中删除(即使该字符没有出现在 EditText 框中)。

您如何防止不需要的字符出现在单词建议框中?

请参阅下面的屏幕截图。请注意,“-”(连字符)出现在建议框中,但没有出现在 EditText 中。另请注意,在连字符之后的建议框中还有另一个有效字符,该字符也未显示在 EditText 中。这实质上会阻止用户输入更多文本,直到他们删除连字符,即使它不在 EditText 中。

更新:同样的问题出现了,可以通过使用 InputFilter 而不是 TextWatcher 来重现。

更新:我想澄清一下,我的目标不是完全压制这些建议。问题是当您阻止特定字符出现在 EditText 中时,它们仍会出现在建议中。我的目标(赏金的目的)是防止相同的特定字符出现在建议中。

在此处输入图像描述

4

3 回答 3

1

您应该使用InputFilter来限制某些字符Edittext

InputFilter filter = new InputFilter() { 
        public CharSequence filter(CharSequence source, int start, int end, 
Spanned dest, int dstart, int dend) { 
                for (int i = start; i < end; i++) { 
                        if (!Character.isLetterOrDigit(source.charAt(i))) { 
                                return ""; 
                        } 
                } 
                return null; 
        } 
}; 

edit.setFilters(new InputFilter[]{filter}); 
于 2011-10-01T07:25:11.820 回答
0

我们可以在布局 xml 文件中执行此操作,并以简单的方式实现您所要求的内容,插入行

android:numeric="your custom elements"
android:digits="your custom elments"
android:inputType="your custom elements"

当您实现这些时,您将能够输入您想要的单词。

于 2011-10-04T12:22:09.853 回答
0

模拟器似乎不支持 textNoSuggestions 和相应的 FLAG (TYPE_TEXT_FLAG_NO_SUGGESTIONS)。这真的很烦人,但是嘿:你不是为模拟器用户开发的,你不应该全神贯注,它可以在所有设备上正常工作。

(请注意,此标志仅适用于 API 级别 5)

于 2011-10-04T09:19:27.853 回答