Android仅为Edittext禁用空间

时间:2015-11-30 07:00:32

标签: android android-edittext space

在我的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("");

此行,所以当时显示错误消息,但此时用户仍然可以输入空格。但我需要的是用户不能输入空格。

15 个答案:

答案 0 :(得分:38)

她是我的解决方案:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"

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

答案 1 :(得分:34)

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

/* 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 });

答案 2 :(得分:11)

此版本支持键盘建议的空格输入。

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 });

PS: Kotlin 版本:

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

答案 3 :(得分:4)

试试这个

使用android:digits不要包含“”(空格)

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

答案 4 :(得分:4)

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 "";
    }
}
});

答案 5 :(得分:3)

在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());
        }
    }

答案 6 :(得分:1)

禁用空间

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (editclicked) {
        if (keyCode == KeyEvent.KEYCODE_SPACE) {
            return false
        }
    } else {
        super.onKeyDown(keyCode, event);
    }
}

答案 7 :(得分:1)

只需在代码中替换它,它就可以完美运行,

etPass.setText(etPass.getText().toString().replaceAll(" ",""));

答案 8 :(得分:1)

我尝试使用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);
        }
    })

答案 9 :(得分:1)

简单易行的方法是:

这将在单击按钮时从文本中删除空格:

GET

您可以在任何需要的地方使用“ String s = etPass.getText().toString().replaceAll(" ",""); ”。

答案 10 :(得分:1)

我发现了一个更好的解决方案,而不是使用数字或编写任何额外的代码,只需执行此操作...

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

它不允许有任何空格。尝试并享受...继续学习和共享

答案 11 :(得分:0)

而不是etPass.setText("");只需从EditText数据中删除空格。

etPass.setText(etPass.getText().toString().trim());
etPass.setSelection(autoComplete.getText().length());

所以您的IF条件如下:

if(str.length() > 0 && str.contains(" "))
{
    etPass.setError("Space is not allowed");
    etPass.setText(etPass.getText().toString().trim());
    etPass.setSelection(etPass.getText().length());
}

答案 12 :(得分:0)

尝试一下,效果很好

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;
    }});

答案 13 :(得分:0)

用于扩展空格的扩展名:

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

要删除editText的空格,请输入:

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

答案 14 :(得分:0)

到目前为止,我发现这很大程度上取决于您的键盘,该键盘会根据返回值更改行为,甚至假设插入了最后一个键盘,它们甚至会删除字符。另外,SwiftKey可能会忽略textNoSuggestions,因此我最终使用了此InputType。TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

etInput.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
etInput.filters = arrayOf(InputFilter { source, start, end, dest, dstart, dend ->
    //val debugMsg = "'" + source + "' (" + start + " - " + end + ") '" + dest + "' (" + dstart + " - " + dend + ")"
    val srcChangeLength = end - start
    if (srcChangeLength <= 0) { //We're deleting a character
        //Log.d("idk", debugMsg + " -> '" + source + "'")
        return@InputFilter source
    }
    val result = if (source is SpannableStringBuilder) source else {
        //Log.d("idk", "Converted source from " + source::class.qualifiedName)
        SpannableStringBuilder(source)
    }
    for (i in end - 1 downTo start) {
        val currentChar = result[i]
        if (Character.isSpaceChar(currentChar)) {
            result.delete(i, i+1) //NOTE: You must modify or return the source. Otherwise,
            //android assumes you're inserting a string and saves the changes for the next callback(?)
        }
    }
    //Log.d("idk", debugMsg + " -> '" + result + "'")
    return@InputFilter result
})

我不是这方面的专家,所以我在这里可能有错误的假设,但这到目前为止对我来说还是有效的。