Android 仅对 Edittext 禁用空间

Posted

技术标签:

【中文标题】Android 仅对 Edittext 禁用空间【英文标题】:Android disable space only for Edittext 【发布时间】:2016-03-03 18:15:17 【问题描述】:

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

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

【问题讨论】:

查看Answer 【参考方案1】:

这个解决方案对我有用:

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

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

【讨论】:

这个答案很好,甚至可以为 input type = number 提供空格,非常感谢@SAndroidD 中文键盘怎么样? 再次按空格键两次或更多次,它会删除前面的字符或将它们大写 此解决方案取决于区域设置,在没有英文字母的国家/地区不起作用【参考方案2】:

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

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

【讨论】:

为什么我点击空格键给空格会删除文本? @Akshaykumar 该错误必须与其他东西有关。提供的代码在这里运行良好。 这种方法有非常奇怪的副作用(如果为此 EditText 启用了建议) - 敲击空格会触发退格等。在 EditText 末尾输入的第一个空格确实被过滤掉了,但是下一个空格敲击的工作方式就像退格擦除输入的文本一样,这很奇怪。为避免这种副作用,您可以使用 inputType="textVisiblePassword" - 使用这种解决方法,它会起作用。 如果您多次按空格键会删除最后一个字符 为什么不把这个放在开头 if (source.toString().equals(" ")) return "";【参考方案3】:

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

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() 
)

【讨论】:

如果为此 EditText 启用建议,这种方法会产生非常奇怪的副作用 - 如果用户点击 BackSpace,整个输入的文本会在 EditText 中翻倍。因此,不是擦除文本就长大了。这有点烦人。 – 斯坦 5 分钟前 Kotlin 过滤器正在创建问题,它正在删除密码类型 EditText 的最大长度配置。 @kevin 这个 kotlin 过滤器在三星设备中不起作用,有没有针对三星设备的解决方案【参考方案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】:

试试这个

使用android:digits,不要包含“”(里面有空格)

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

【讨论】:

只使用android:inputType="number" 就可以完成禁用空格键的工作【参考方案6】:

在 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中输入空格时工作正常,但在文本之间输入空格时,editext中的后空格文本消失,此问题的任何解决方案@Moti 我现在检查了这个,但它没有发生在我身上:\ @OmBala 找出问题所在@Moti,我们在输入类型中给出了TYPE_TEXT_FLAG_NO_SUGGESTIONS【参考方案7】:

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

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

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

【讨论】:

这很好用,【参考方案8】:

我尝试使用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】:

删除空格的扩展:

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

去掉editText输入的空格:

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

【讨论】:

【参考方案10】:

试试这个,效果很好

科特林:

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

【讨论】:

【参考方案11】:

只需在您的代码中替换它,它应该可以完美运行,

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

【讨论】:

你可以使用editText.setSelection(editText.getText().toString().length()在末尾移动光标【参考方案12】:

禁用空间使用

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

【讨论】:

【参考方案13】:

而不是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());

【讨论】:

【参考方案14】:

到目前为止,我发现这在很大程度上取决于您的键盘,它会根据返回值改变行为,甚至在插入最后一个字符的情况下删除字符。另外,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
)

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

【讨论】:

以上是关于Android 仅对 Edittext 禁用空间的主要内容,如果未能解决你的问题,请参考以下文章

仅对部分代码禁用 PHP 警告

Android EditText禁用编辑但允许滚动

如何在 Android 中禁用 EditText

Android Oreo 禁用 EditText 的自动填充

Android:如何在 Edittext 中完全禁用复制和粘贴功能

如何在 EditText Android 中禁用退格行​​为?