禁用 Android EditText 中的空格输入

41

在我的Android应用程序中,我只需要禁用空格键。但是我没有找到解决这个问题的方法。我需要禁用空格键,并且当用户输入空格时不应起作用;特殊字符、字母、数字和其他所有内容-应该正常工作。我尝试过的是:

etPass.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub
        String str = s.toString();
        if(str.length() > 0 && str.contains(" ")) {
            etPass.setError("Space is not allowed");
            etPass.setText("");
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub
    }

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub
    }
});

但问题在于,一旦输入空格,整个文本都会被删除。

我已经移除了etPass.setText("");,所以在这种情况下会显示错误消息,但此时用户仍然可以输入空格。但我的要求是用户不应该能够输入空格。


请查看此答案 - W I Z A R D
16个回答

84

这个解决方案对我有用:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
将其添加到XML文件中的EditText中。

这个答案很好,甚至可以为 input type = number 提供空格,非常感谢 @SAndroidD。 - Sudhir Belagali
9
在中文键盘上怎么样? - CHarris
7
当再次按下空格键两次或更多次时,它会删除先前的字符或将其大写。 - Oush
9
此解决方案依赖于地区设置,无法在没有英文字母的国家运行。 - 11m0
最佳解决方案.. - undefined

44

为什么不考虑一个字符过滤器... 这里有一段示例代码。

/* To restrict Space Bar in Keyboard */
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.isWhitespace(source.charAt(i))) {
                return "";
            }
        }
        return null;
    }

};
input.setFilters(new InputFilter[] { filter });

10
为什么我按空格键输入空格,却会导致文本被删除? - Akshay kumar
@Akshaykumar那个错误肯定和其他问题有关。我这里提供的代码运行良好。 - thijsonline
7
如果启用了EditText的建议功能,这种方法会产生非常奇怪的副作用——点击空格键会触发退格键。在EditText末尾输入第一个空格会被过滤掉,但是接下来的空格按键会像退格键一样擦除已输入的文本,这完全不合理。为避免这种副作用,你可以使用inputType="textVisiblePassword"的解决方法,以此来解决这个问题。 - Stan
1
如果您按下空格键多次,则会删除最后一个字符。 - Arutha
如果(source.toString().equals(" ")),为什么不在开头就返回""呢? - dharmendra

19

此版本支持使用键盘的建议输入,包括空格。

InputFilter filter = new InputFilter() {
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String filtered = "";
        for (int i = start; i < end; i++) {
            char character = source.charAt(i);
            if (!Character.isWhitespace(character)) {
                filtered += character;
            }
        }

        return filtered;
    }

};

input.setFilters(new InputFilter[] { filter });

提示信息: Kotlin 版本:

input.filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
    source.toString().filterNot { it.isWhitespace() }
})

9
如果为这个 EditText 启用建议功能,那么这种方法会产生非常奇怪的副作用 - 如果用户点击退格键,那么输入的整个文本将在 EditText 中翻倍。因此,文本不是被删除,而是不断增长。这有点令人恼火。 - Stan
Kotlin 过滤器出现问题,它正在删除密码类型 EditText 的最大长度配置。 - CoDe
@kevin 这个 Kotlin 过滤器在三星设备上不起作用,有没有针对三星设备的解决方案? - Om Bala

6
我找到了一种更好的解决方案,而不是使用数字或编写任何额外的代码,只需执行以下步骤...
tiePassword.filters = tiePassword.filters.let {
        it + InputFilter { source, _, _, _, _, _ ->
            source.filterNot { char -> char.isWhitespace() }
        }
    }

这将不允许任何空格。尝试并享受...保持学习和分享


1
这个很好用。 - Mahmoud Ayman
1
输入@符号后出现重复字符的问题很好。 - Olek
@OlekL,你有没有为在EditText上输入类似@符号的重复字符找到任何解决方案? - RaJ

5
我尝试使用InputFilter解决方案,但对我无效,因为如果尝试按退格键,则整个输入的文本在EditText中会翻倍。

这个解决方案在Kotlin中使用TextWatcher适用于我:

editText.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { }

    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { }

    override fun afterTextChanged(p0: Editable?) {
        val textEntered = editText.text.toString()

        if (textEntered.isNotEmpty() && textEntered.contains(" ")) {
            editText.setText(editText.text.toString().replace(" ", ""));
            editText.setSelection(editText.text!!.length);
        }
    }})

5

试试这个

使用android:digits,不要包含空格

<EditText
    android:inputType="number"
    android:digits="0123456789.abcdefghijklmnl....."// write character that you want to allow
/>

只需使用 android:inputType="number" 就可以禁用空格键。 - Basil Victor

5
EditText yourEditText = (EditText) findViewById(R.id.yourEditText);
yourEditText.setFilters(new InputFilter[] {
    @Override
    public CharSequence filter(
        CharSequence cs, int start, int end,
        Spanned spanned, int dStart, int dEnd
    ) {
        /** For backspace */
        if (cs.equals("") {
             return cs;
        }

        /** Here is no space character */
        if (cs.toString().matches("[a-zA-Z]+")) {
            return cs;
        }

        return "";
    }
});

5

试试这个,它可以很好地工作

Kotlin:

editText.filters = arrayOf(object : InputFilter {
    override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence? {
        // eliminates single space
        if (end == 1) {
            if (Character.isWhitespace(source?.get(0)!!)) {
                return ""
            }
        }
        return null
    }
})

Java:

editText.setFilters(new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
    if (end == 1) {
        if (Character.isWhitespace(source.charAt(0))) {
            return "";
        }
    }
    return null;
}});

5

删除空格的扩展:

fun String.removeSpace() = trim().replace("\\s+".toRegex(), replacement = "")

去除EditText输入的空格:

val removeFilter = InputFilter { s, _, _, _, _, _ -> s.toString().removeSpace() }
editText.apply { filters = filters.plus(removeFilter) }

4
afterTextChanged方法中添加以下代码:
public void afterTextChanged(Editable s) {
    String str = etPass.getText().toString();
    if (str.length() > 0 && str.contains(" ")) {
        etPass.setText(etPass.getText().toString().replaceAll(" ",""));
        etPass.setSelection(etPass.getText().length());
    }
}

在EditText中输入空格时,如果在末尾输入,则正常工作,但是当在文本之间输入空格时,EditText中的空格后面的文本会消失。对于这个问题有什么解决方案吗?@Moti - Om Bala
我现在检查了一下,这种情况并没有发生在我身上 :\ @OmBala - Moti
1
找出了问题@Moti,我们在输入类型中使用了TYPE_TEXT_FLAG_NO_SUGGESTIONS。 - Om Bala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接