在我的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("");
此行,所以当时显示错误消息,但此时用户仍然可以输入空格。但我需要的是用户不能输入空格。
答案 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
})
我不是这方面的专家,所以我在这里可能有错误的假设,但这到目前为止对我来说还是有效的。