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 禁用空间的主要内容,如果未能解决你的问题,请参考以下文章
Android Oreo 禁用 EditText 的自动填充