Android仅为Edittext禁用空间

ros*_*ter 23 android space android-edittext

在我的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

            }
        });
Run Code Online (Sandbox Code Playgroud)

但这里的问题是一旦空格全文删除.我删除了

etPass.setText("");
Run Code Online (Sandbox Code Playgroud)

这一行,所以当时显示错误信息,但那时用户仍然可以输入空格.但我需要的是用户不应该键入空格.

SAn*_*idD 48

她是我的解决方案:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
Run Code Online (Sandbox Code Playgroud)

将其添加到xml文件中的编辑文本中

  • 在中文键盘上呢? (4认同)
  • 再次按空格键两次或更多次,它会删除以前的字符或将它们大写 (4认同)
  • 此解决方案取决于语言环境,并且在没有英文字母的国家/地区无法使用 (2认同)

Don*_*pan 35

你为什么不考虑字符过滤器..这是一个示例代码片段.

/* 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 });
Run Code Online (Sandbox Code Playgroud)

  • 如果我点击空格键给出空格,为什么要删除文本? (7认同)
  • 这种方法有非常奇怪的副作用(如果为此EditText启用了建议) - 点击空间触发器如退格键.EditText末尾的第一个输入空间确实过滤掉了,但是下一个空格tappings的工作方式就像退格删除输入的文本一样,这很奇怪.为避免这种副作用,您可以使用inputType ="textVisiblePassword" - 使用此解决方法,它将起作用. (5认同)

Kev*_*tel 12

此版本支持键盘的空间建议输入.

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 });
Run Code Online (Sandbox Code Playgroud)

PS:Kotlin版本:

input.filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
    source.toString().filterNot { it.isWhitespace() }
})
Run Code Online (Sandbox Code Playgroud)

  • 如果为此EditText启用了建议,则此方法具有非常奇怪的副作用 - 如果用户点击BackSpace,则整个输入的文本在EditText中加倍.因此,不是擦除文本而是长大.多数民众赞成有点烦人. - 斯坦5分钟前 (5认同)

Rjz*_*ara 7

我找到了更好的解决方案,而不是使用数字或编写任何额外的代码,只需做这些事情......

tiePassword.filters = tiePassword.filters.let {
        it + InputFilter { source, _, _, _, _, _ ->
            source.filterNot { char -> char.isWhitespace() }
        }
    }
Run Code Online (Sandbox Code Playgroud)

它不会允许任何空间。尝试并享受...继续学习和分享


N J*_*N J 6

尝试这个

使用时 android:digits请勿在其中添加“”(空格)

<EditText
    android:inputType="number"
    android:digits="0123456789.abcdefghijklmnl....."// write character that you want to allow
/>
Run Code Online (Sandbox Code Playgroud)


joh*_*o07 5

EditText yourEditText = (EditText) findViewById(R.id.yourEditText);
yourEditText.setFilters(new InputFilter[] {
new InputFilter() {
    @Override
    public CharSequence filter(CharSequence cs, int start,
                int end, Spanned spanned, int dStart, int dEnd) {
        // TODO Auto-generated method stub
        if(cs.equals("")){ // for backspace
             return cs;
        }
        if(cs.toString().matches("[a-zA-Z]+")){ // here no space character
             return cs;
        }
        return "";
    }
}
});
Run Code Online (Sandbox Code Playgroud)


pab*_*ros 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);
        }
    }})
Run Code Online (Sandbox Code Playgroud)


Ser*_*buz 5

删除空格的扩展:

fun String.removeSpace() = trim().replace("\\s+".toRegex(), replacement = "")
Run Code Online (Sandbox Code Playgroud)

删除EditText输入空格:

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