【问题标题】:Android disable space only for EdittextAndroid 仅对 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("");

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

【问题讨论】:

标签: android android-edittext space


【解决方案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
              })
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-06-12
                • 2011-05-16
                • 1970-01-01
                • 1970-01-01
                • 2012-02-02
                • 2016-11-23
                • 2013-07-11
                • 2012-05-07
                相关资源
                最近更新 更多